在使用Mongo驱动程序时,我希望检索无Schemaless文档。
我可以使用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":""
}
}而是我想要的东西,它是如何储存在蒙戈。
{
"id":"<ObjectId>",
"some":""
}我不能直接使用这样的东西,因为我想将它转换为struct来处理一些属性。
var pr bson.M
err := p.FindOne(ctx, &p.options,query, &pr)如何删除在从Mongo转换无模式文档时添加的额外密钥?
我是否需要显式地覆盖MarshalJSON(),还是使用标记提供了什么?
发布于 2020-04-08 02:30:01
如何删除在从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]}我不能直接使用这样的东西,因为我想将它转换为struct来处理一些属性。
您可以将其直接用于查询谓词。例如:
// After decoding 'doc' to product
var result bson.M
err := collection.FindOne(context.TODO(), doc).Decode(&result)使用MongoDB Go驱动器 v1.3.2进行测试
更新:
如果您想返回JSON,可以使用bson.MarshalExtJSON()。在处理JSON中不存在的对象方面,这也应该更容易一些。即ObjectId.例如:
// After decoding 'doc' to product
ejson, err := bson.MarshalExtJSON(doc, true, false)
fmt.Println(string(ejson)) https://stackoverflow.com/questions/61086720
复制相似问题