Go Import JSON File Into MongoDB Unstructured
During a recent POC I imported a Terraform state file(JSON) into MongoDB using golang. This may not exactly fit any use case since it is simpler and use actual file(s) and not MongoDB to store a Terraform state file, but this helps record my effort as well as the unstructured nature of the JSON ie I am not defining a structure just using an interface{}.
Insert From File
package main
import (
"context"
"fmt"
"os"
"io/ioutil"
"encoding/json"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
func main() {
clientOptions := options.Client().ApplyURI("mongodb://localhost:27017")
client, e := mongo.Connect(context.TODO(), clientOptions)
CheckError(e)
collection := client.Database("tfstatedb").Collection("states")
jsonFile, err := os.Open("terraform.tfstate")
if err != nil {
fmt.Println(err)
}
defer jsonFile.Close()
byteValue, _ := ioutil.ReadAll(jsonFile)
var result map[string]interface{}
json.Unmarshal([]byte(byteValue), &result)
_, e = collection.InsertOne(context.TODO(), result)
CheckError(e)
}
func CheckError(e error) {
if e != nil {
fmt.Println(e)
}
}
FindOne From DB
package main
import (
"flag"
"log"
"context"
"fmt"
"encoding/json"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
var (
flagId string
)
func init() {
flag.StringVar(&flagId, "id", "", "mongodb ObjectId")
}
func PrettyPrint(v interface{}) (err error) {
b, err := json.MarshalIndent(v, "", " ")
if err == nil {
fmt.Println(string(b))
}
return
}
func main() {
if !flag.Parsed() {
flag.Parse()
}
if flagId != "" {
fmt.Println("finding id: " + flagId)
} else {
log.Fatal("no _id specified")
}
clientOptions := options.Client().ApplyURI("mongodb://localhost:27017")
client, e := mongo.Connect(context.TODO(), clientOptions)
CheckError(e)
e = client.Ping(context.TODO(), nil)
CheckError(e)
collection := client.Database("tfstatedb").Collection("states")
var res interface{}
docID, e := primitive.ObjectIDFromHex(flagId)
CheckError(e)
filter := bson.M{"_id": docID}
tempResult := bson.M{}
e = collection.FindOne(context.TODO(), filter).Decode(&tempResult)
if e == nil {
obj, _ := json.Marshal(tempResult)
e = json.Unmarshal(obj, &res)
}
PrettyPrint(res)
}
func CheckError(e error) {
if e != nil {
fmt.Println(e)
}
}