在使用Mongo Golang驱动程序时,我想检索无模式文档。
我能够使用bson.M
json:",inline" bson:",inline"
来检索文档
但这会在我尝试解码为结构时在JSON中添加额外的“ M” 键
type Product struct {
ID primitive.ObjectID `bson:"_id"`
ProductId string `bson:"product_id" json:"product_id"`
bson.M `json:",inline" bson:",inline"`
}
输出:-
{
"id":"<ObjectId>",
"M":{
"some":""
}
}
但是我想要的是它如何存储在Mongo中。
{
"id":"<ObjectId>",
"some":""
}
我不能直接使用类似这样的东西,因为我想将其强制转换为可使用某些属性的结构
var pr bson.M
err := p.FindOne(ctx, &p.options,query, &pr)
在从Mongo转换无模式文档时,如何删除添加的额外键?
我是否需要显式覆盖MarshalJSON()或使用标签提供了某些内容?
答案 0 :(得分:0)
在从Mongo转换无模式文档时,如何删除添加的额外键?
您只需定义一个字段映射名称,该名称在编组时将被展平。例如:
type Product struct {
ID primitive.ObjectID `bson:"_id"`
ProductId string `bson:"product_id"`
Others bson.M `bson:",inline"`
}
解码文档时,您会看到它会包含其他没有Others
名称的字段。例如,如果您有一个文档:
{
"_id": ObjectId("5e8d330de85566f5a0557ea4"),
"product_id": "foo",
"some": "x",
"more": "y"
}
doc := Product{}
err = cur.Decode(&doc)
fmt.Println(doc)
// Outputs
// {ObjectID("5e8d330de85566f5a0557ea4") foo map[more:y some:x]}
我不能直接使用类似这样的东西,因为我想将其强制转换为可使用某些属性的结构
您可以将其直接用于查询谓词。例如:
// After decoding 'doc' to product
var result bson.M
err := collection.FindOne(context.TODO(), doc).Decode(&result)
使用MongoDB Go driver v1.3.2
进行了测试已更新:
如果您想返回JSON,则可以使用bson.MarshalExtJSON()。就处理JSON中不存在的对象而言,这也应该更容易。即ObjectId。例如:
// After decoding 'doc' to product
ejson, err := bson.MarshalExtJSON(doc, true, false)
fmt.Println(string(ejson))