我有一个API的JSON,我想使用mgo包保存到MongoDB。我的JSON看起来像这样:
{
"something": "value"
"collection": [
{ "obj1": "value" }
// ... (Variable number of objects here)
]
}
为了保存这些数据,我在Go应用程序中创建了一个新的type
,如下所示:
type MyData struct {
Something string
Collection []string // This actually contains more than strings but I'll be happy if I can just get strings saved
}
mongoSess, err := mgo.Dial("localhost:27017")
if err != nil {
panic(err)
}
defer mongoSess.Close()
c := mongoSess.DB("mydatabase").C("mycollection")
insertErr := c.Insert(&MyData{something, collection})
此代码有效,但问题是它不能保存我的集合字段中的任何内容,该字段应该是JSON对象的数组。什么都没有。我得到了我的数据库中的密钥,它们是正确的类型,但它们没有数据。以下是Mongo输出的内容:
{ "_id" : ObjectId("5520c535a236d8a9a215d096"), "something" : "value", "collection" : [ ] }
有谁能发现我做错了什么?我显然对Go很陌生并且遇到类型问题。
这里的答案对我帮助很大。我没有正确解释事情,因为答案让我走上了正确的轨道,但没有直接解决问题。这是实际的解决方案。
package main
import (
"encoding/json"
"github.com/bitly/go-simplejson"
"gopkg.in/mgo.v2"
//"gopkg.in/mgo.v2/bson"
// Other packages are used as well
)
type MyData struct {
Something int
Collection []interface{}
}
func main() {
// I'm using SimpleJson for parsing JSON
collection, cerr := jsonFromExternalApi.Get("collection").Array()
if cerr != nil {
logger.Debug.Fatalln(cerr)
}
// Save response to Mongo (leaving out all the connection code)
c := mongoSess.DB("mydb").C("mycollection")
insertErr := c.Insert(&Producer{npn, licenses })
}
问题是SimpleJSON将API调用中的对象数组作为[]interface{}
返回。我不知道我可以简单地声明一个结构的一部分作为一个接口,所以不是只是纠正Go的编译器告诉我错误的东西,而是让它变得比它应该的更难。
来自松散类型的脚本语言,像这样的东西真的让我兴奋,有时很难看到好处,但希望有一天能帮助别人。
答案 0 :(得分:3)
看起来你的数据结构错误了。
insertErr := c.Insert(&MyData{something, collection})
something => string
和collection => slice
你的代码应该是这样的:
insertErr := c.Insert(&MyData{"something", []string{"obj1", "value"}})
Here是工作代码。
[{Something:something Collection:[obj1 value]} {Something:something Collection:[obj1 value]} {Something:something Collection:[obj1 value]} {Something:something Collection:[obj1 value]}]
答案 1 :(得分:1)
在这里,您没有在MyData结构中为Collection定义正确的类型。
Collection []string //This is what you are defining.
但是从Json你没有得到string array
,你得到map[string]interface{}
这就是你没有正确填充Mydata结构的原因
正确的MyData结构将是
type MyData struct {
Something string
Collection map[string]string // This actually contains more than strings but I'll be happy if I can just get strings saved
}