Golang Mongo驱动程序检索无模式文档

时间:2020-04-07 18:17:21

标签: mongodb go

在使用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()或使用标签提供了某些内容?

1 个答案:

答案 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))