从 go 中的 mongo 获取纯 json

dev*_*ren 2 json go mongodb mgo

mongo我正在尝试从ingo和 using 中获取一些数据gopkg.in/mgo.v2。我在 mongo 中有一个嵌套数据。

注意:这是一个旧数据库,我无法更改其结构,只想查询数据。

id我有一个包含字段,name和 的数据库details。我必须根据id 我的代码获取详细信息:

package main

import (
    "fmt"
    "gopkg.in/mgo.v2"
    "gopkg.in/mgo.v2/bson"
)

type Person struct {
    Name string
    Id string
    Details string
}


func main() {

    session, err := mgo.Dial("mongodb://localhost:27017/naren")

    c := session.DB("naren").C("people")

    result := Person{}
    err = c.Find(bson.M{"id": "12345"}).One(&result)
    if err != nil {
        fmt.Println(err)
    }

    fmt.Println("Details:", result.Details)
    fmt.Println("Name:", result.Name)
    fmt.Println("Id:", result.Id)
}
Run Code Online (Sandbox Code Playgroud)

Id并且Name打印正常,但result.Details即使有数据也会打印空字符串。我只想将 json 打印为字符串或对 json 数据感到满意。

我也尝试过

...
type Person struct { 
    ...
    Details string `json:"details"`
}
Run Code Online (Sandbox Code Playgroud)

但仍然得到空字符串。提前致谢。

dev*_*ren 5

我很新。现在这看起来非常基本。detailskey的值为JSON

解决方法是我将详细信息类型更改为bson.M

type Person struct {
    Name string
    Id string
    Details string
}
Run Code Online (Sandbox Code Playgroud)

type Person struct {
    Name string
    Id string
    Details bson.M
}
Run Code Online (Sandbox Code Playgroud)

现在我可以访问详细信息,例如

res, err := json.Marshal(result.Details)

fmt.Println(string(res))
Run Code Online (Sandbox Code Playgroud)

感谢@putu 为我指明了正确的方向。