如何正确编写嵌套的bson.M {}

时间:2019-07-08 11:20:29

标签: mongodb go struct mongo-go

假设我们具有以下结构:

type shop struct {
   ID primitive.ObjectID `json:"_id,omitempty" bson:"_id,omitempty"`
   Brands *brand         `json:"brand,omitempty" bson:"brand,omitempty"`
}

type brand struct {
  ID primitive.ObjectID `json:"_id,omitempty" bson:"deploymentid,omitempty"`
}

我尝试使用findOne()查找文档,但是即使使用MongoDB Shell进行结果匹配也没有得到任何文档。

filter := bson.M{"brand" : bson.M{"_id" : someValue}}
var shopWithBrand shop
mycollection.findOne(ctx , filter).Decode(&shopWithBrand)

我犯了什么错误?

1 个答案:

答案 0 :(得分:1)

此过滤器:

filter := bson.M{"brand" : bson.M{"_id" : someValue}}

告诉您要具有brand字段的文档是嵌入式文档只有一个_id字段,其值为someValue。< / p>

如果您的嵌入式文档仅包含一个单独的_id字段,但是嵌入的brand的ID字段映射到deploymentid,并且很可能具有其他字段,则这实际上将起作用很好(为了使示例最小化,已“删除”了),这就是为什么它不匹配的原因。

相反,您希望具有brand字段的文档是具有匹配的deployment字段以及其他字段的文档。这是您可以表达的方式:

filter := bson.M{"brand.deploymentid" : someValue}