从 mongo 中获取普通 json
Fetch plain json from mongo in go
我正在尝试从 go
中的 mongo
获取一些数据并使用 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)
}
Id
和 Name
打印正常,但 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.M
或 bson.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
}
我正在尝试从 go
中的 mongo
获取一些数据并使用 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)
}
Id
和 Name
打印正常,但 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.M
或 bson.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
}