如何检索[]bson.M类型的地图

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)

如果它是用嵌套结构或结构中的映射完成的,那对我也有用

Mar*_*erg 5

我将为您提供一个通用示例来帮助您理解,因为 SO 不是免费的编码服务,而是一个同行互相帮助掌握问题的平台。

\n\n

我的方法是不使用bson.M返回值。

\n\n
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\n
    \n
  1. 我的结构定义中不需要单个字符即可将结构编组到 BSON 或从 BSON 编组。这是由 mgo根据文档中描述的规则自动完成的。但是,您可以自定义(取消)封送的行为,如此处所述。
  2. \n
  3. 未导出的字段 (hidden在本例中)在解组 \xe2\x80\x93 时取零值,请记住这一点,它可能会咬住你的脖子。
  4. \n
  5. 无需使用bson.M来处理数据,这使生活变得更加轻松 \xe2\x80\x93 例如,无需手动类型转换。
  6. \n
\n\n

总之:您所需要做的就是创建一个可以将数据整理成的结构。然后您可以像往常一样访问各个字段,而无需进行字符串操作等。正如您所看到的,这是一项工作,但相当微不足道。

\n\n

注意:您显示的数据模型在语法和概念上都不正确。现在先把前者放在一边:将值作为键是一种非常糟糕的做法,如子group文档中所示。这总是迫使您来回处理字符串解析,使您作为开发人员的 MongoDB 生活变得非常复杂。

\n\n

我的上述建议假设您将其更正为:

\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