从 mongo 中获取普通 json

Fetch plain json from mongo in go

我正在尝试从 go 中的 mongo 获取一些数据并使用 gopkg.in/mgo.v2。我在 mongo.

中有一个嵌套数据

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

我有一个包含字段 idnamedetails 的数据库。我必须根据 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)
}

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

我也试过了

...
type Person struct { 
    ...
    Details string `json:"details"`
}

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

我很新去的。现在这看起来很基本。键 details 的值为 JSON

修复方法是我将详细信息的类型更改为 bson.M

来自

type Person struct {
    Name string
    Id string
    Details string
}

type Person struct {
    Name string
    Id string
    Details bson.M
}

现在我可以访问

等详细信息
res, err := json.Marshal(result.Details)

fmt.Println(string(res))

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

在我的例子中,该字段是一个嵌入式文档(可能是一个 JSON 对象或一个 JSON 数组)。我必须将字段类型设置为 bson.RawValue:

type Person struct {
    Name string
    Id string
    Details bson.RawValue
}

然后使用 if-else:

检查 Details 是对象还是数组
var d interface{}

var m bson.M
var a bson.A

e := person.Details.Unmarshal(&m)
d = m

if e != nil {
        _ = person.Details.Unmarshal(&a)
        d = a
}

解组后,d 将是 bson.Mbson.A


旁注bson.M{} 对象将默认解码为 {Key: realKey, Value: realValue},如果你想要 {realKey: realValue} 结构,使用自定义注册表解组:

rb := bson.NewRegistryBuilder()
rb.RegisterTypeMapEntry(bsontype.EmbeddedDocument, reflect.TypeOf(bson.M{}))
reg := rb.Build()

var d interface{}

var m bson.M
var a bson.A

e := object.Data.UnmarshalWithRegistry(reg, &m)
d = m

if e != nil {
        _ = object.Data.UnmarshalWithRegistry(reg, &a)
        d = a
}