Soh*_*ikh 4 struct go mongodb bson mgo
如何检索多维[]bson.M类型的地图
mongo中的数据就像
"taskData" : {
"createdOn" : ISODate("2016-02-20T21:23:11.903Z"),
"Task_content" : "@bob",
"Priority" : "2",
"owner_Uname" : "alice"
}
Run Code Online (Sandbox Code Playgroud)
我尝试访问它的代码
var n []bson.M
e := collection.Find(bson.M{"users."+strconv.Itoa(j)+".user_name" : r.FormValue("value[userName]")}).Select(bson.M{"taskData.owner_Uname":1,"_id":0}).All(&n)
if e != nil {
fmt.Println("Error : ",e)
}else{
fmt.Println(n[0]["taskData"])
}
Run Code Online (Sandbox Code Playgroud)
得到这样的输出
map[owner_Uname:alice]
Run Code Online (Sandbox Code Playgroud)
我需要使用另一个查询访问这个结果字符串。这是一个界面,我尝试将其转换为简单的地图
newMap :=n[0]["taskData"].(map[string]interface{})
,但它给了我一个运行时错误interface conversion: interface {} is bson.M, not map[string]interface {}
result := rawData{}
err := collection.Find(bson.M{"user_name":n[0]["taskData"]["owner_Uname"]}).All(&result)
Run Code Online (Sandbox Code Playgroud)
现在我想在上面的查询中使用它......请帮助我。提前致谢
编辑:- mongo 中的数据就像
{
"_id" : ObjectId("56bf128f5a9a6a0ebfdd5075"),
"deadLine" : {
"Start_time" : ISODate("2016-05-24T00:00:00Z"),
"End_time" : ISODate("2016-05-29T00:00:00Z")
},
},
"taskData" : {
"createdOn" : ISODate("2016-02-20T21:23:11.903Z"),
"Task_content" : "@bob",
"Priority" : "2",
"owner_Uname" : "alice"
},
"group" : {
"1" : {
"grp_name" : "grp"
},
"2" : {
"grp_name" : "secondGrp"
}
}
Run Code Online (Sandbox Code Playgroud)
如果它是用嵌套结构或结构中的映射完成的,那对我也有用
我将为您提供一个通用示例来帮助您理解,因为 SO 不是免费的编码服务,而是一个同行互相帮助掌握问题的平台。
\n\n我的方法是不使用bson.M
返回值。
package main\n\nimport (\n "fmt"\n "time"\n\n "gopkg.in/mgo.v2"\n "gopkg.in/mgo.v2/bson"\n)\n\ntype Baz struct {\n Date time.Time\n Value int\n}\n\ntype Bar struct {\n Name string\n Baz []Baz\n}\n\ntype Foo struct {\n Owner string\n hidden int\n Bar Bar\n}\n\nconst (\n ds = "localhost:27017"\n db = "test"\n coll = "nestdemo"\n)\n\nfunc main() {\n\n o := Foo{\n Owner: "me",\n hidden: 1,\n Bar: Bar{\n Name: "funky",\n Baz: []Baz{\n Baz{Date: time.Now(), Value: 42},\n },\n },\n }\n\n // CHECK ERRORS in production environments\n conn, _ := mgo.Dial(ds)\n defer conn.Close()\n\n c := conn.DB(db).C(coll)\n c.Insert(o)\n\n l := &Foo{}\n\n c.Find(bson.M{"owner": "me"}).One(l)\n\n fmt.Printf("Loaded data: %+v\\n", l)\n fmt.Printf(\n "You got your answer to life, the universe and all the rest at %s: %d\\n",\n l.Bar.Baz[0].Date.Format(time.Kitchen), l.Bar.Baz[0].Value,\n )\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n您可以在本地计算机上运行该程序(根据需要调整常量),这应该给您一个如下所示的输出:
\n\n$ go run main.go \nLoaded data: &{Owner:me hidden:0 Bar:{Name:funky Baz:[{Date:2016-02-24 09:00:06.471 +0100 CET Value:42}]}}\nYou got your answer to life, the universe and all the rest at 9:00AM: 42\n
Run Code Online (Sandbox Code Playgroud)\n\n相应集合中的条目应如下所示:
\n\n{\n "_id" : ObjectId("56cd6306538ba56563bdab76"),\n "owner" : "me",\n "bar" : {\n "name" : "funky",\n "baz" : [\n {\n "date" : ISODate("2016-02-24T08:00:06.471Z"),\n "value" : 42\n }\n ]\n }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n这里需要注意一些事情。
\n\nhidden
在本例中)在解组 \xe2\x80\x93 时取零值,请记住这一点,它可能会咬住你的脖子。bson.M
来处理数据,这使生活变得更加轻松 \xe2\x80\x93 例如,无需手动类型转换。总之:您所需要做的就是创建一个可以将数据整理成的结构。然后您可以像往常一样访问各个字段,而无需进行字符串操作等。正如您所看到的,这是一项工作,但相当微不足道。
\n\n注意:您显示的数据模型在语法和概念上都不正确。现在先把前者放在一边:将值作为键是一种非常糟糕的做法,如子group
文档中所示。这总是迫使您来回处理字符串解析,使您作为开发人员的 MongoDB 生活变得非常复杂。
我的上述建议假设您将其更正为:
\n\n{\n\xe2\x80\xa6\n groups:[\n {grp_id: 1, grp_name: "grp"},\n {grp_id: 2, grp_name: "secondGrp"}\n ]\n\xe2\x80\xa6\n}\n
Run Code Online (Sandbox Code Playgroud)\n