Rajesh Kumar
Rajesh Kumar

Reputation: 207

Need help to storing an map of type interface in my mongodb database using golang

I m in the process of creating application where my back end is in go lang and database is mongoDB. My problem is that i have a map in my struct declared like

Data struct {
        data   map[interface{}]interface{}
}

after adding values in to this like

var data Data
    data["us"]="country"
    data[2]="number"
    data["mother"]="son"

I m inserting it like

c.Insert(&data)

When i insert this i m losing my key and can only see the values...

{
    "_id" : Object Id("57e8d9048c1c6f751ccfaf50"),
    "data" : {
        "<interface {} Value>" : "country",
        "<interface {} Value>" : "number",
        "<interface {} Value>" : "son"
    },

}

May i know any way possible to use interface and get both key and values in my mongoDB. Thanks....

Upvotes: 2

Views: 6028

Answers (1)

CrazyCrow
CrazyCrow

Reputation: 4235

You can use nothing but string as key in MongoDB documents. Even if you would define your Data structure as map[int]interface{} Mongo (don't know if mgo will convert types) wouldn't allow you to insert this object into the database. Actually, you can use nothing but string as JSON key at all as this wouldn't be JSON (try in your browser console the next code JSON.parse('{2:"number"}')).

So define your Data as bson.M (shortcut for map[string]interface{}) and use strconv package to convert your numbers into strings.

But I guess you must look at arrays/slices, as only one reason why someone may need to have numbers as keys in JSON is iterations through these fields in future. And for iterations we use arrays.

Update: just checked how mgo deals with map[int]interface{}. It inserts into DB entry like {"<int Value>" : "hello"}. Where <int Value> is not number but actually string <int Value>

Upvotes: 3

Related Questions