首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Go Mongo驱动程序检索无模式文档

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

Stack Overflow用户
提问于 2020-04-07 18:17:21
回答 1查看 226关注 0票数 1

在使用Mongo驱动程序时,我希望检索无Schemaless文档。

我可以使用bson.M json:",inline" bson:",inline"检索文档,但当我试图对结构进行解码时,这会在json中添加额外的"M"键。

代码语言:javascript
复制
type Product struct {
    ID        primitive.ObjectID `bson:"_id"`
    ProductId string `bson:"product_id" json:"product_id"`
    bson.M `json:",inline" bson:",inline"`
}

产出:-

代码语言:javascript
复制
{
 "id":"<ObjectId>",
 "M":{
    "some":""
  }
}

而是我想要的东西,它是如何储存在蒙戈。

代码语言:javascript
复制
{
  "id":"<ObjectId>",
  "some":""
}

我不能直接使用这样的东西,因为我想将它转换为struct来处理一些属性。

代码语言:javascript
复制
var pr bson.M
err := p.FindOne(ctx, &p.options,query, &pr)

如何删除在从Mongo转换无模式文档时添加的额外密钥?

我是否需要显式地覆盖MarshalJSON(),还是使用标记提供了什么?

EN

回答 1

Stack Overflow用户

发布于 2020-04-08 02:30:01

如何删除在从Mongo转换无模式文档时添加的额外密钥?

您只需定义字段映射名称,在封送处理时将将其扁平化。例如:

代码语言:javascript
复制
type Product struct {
    ID          primitive.ObjectID      `bson:"_id"`
    ProductId   string                  `bson:"product_id"`
    Others      bson.M                  `bson:",inline"`
}

当您解码一个文档时,您将看到它将包含没有Others名称的其他字段。例如,如果您有一个文档:

代码语言:javascript
复制
{
 "_id": ObjectId("5e8d330de85566f5a0557ea4"), 
 "product_id": "foo", 
 "some": "x", 
 "more": "y"
}
代码语言:javascript
复制
doc := Product{}
err = cur.Decode(&doc)
fmt.Println(doc)
// Outputs 
// {ObjectID("5e8d330de85566f5a0557ea4") foo map[more:y some:x]}

我不能直接使用这样的东西,因为我想将它转换为struct来处理一些属性。

您可以将其直接用于查询谓词。例如:

代码语言:javascript
复制
// 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.例如:

代码语言:javascript
复制
// After decoding 'doc' to product
ejson, err := bson.MarshalExtJSON(doc, true, false)
fmt.Println(string(ejson)) 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61086720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档