假设我们具有以下结构:

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)

我犯了什么错误?

最佳答案

此过滤器:

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

告诉您想要具有brand字段的文档,该字段是嵌入式文档,具有单个_id字段,其值为someValue的值。

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

相反,您希望具有brand字段的文档是在其他字段中具有匹配的deployment字段的文档。这是您可以表达的方式:
filter := bson.M{"brand.deploymentid" : someValue}

关于mongodb - 如何正确编写嵌套的bson.M {},我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56933823/

10-12 15:03