在mongodb中特定于数组匹配的对象中查找与对象内部的数组匹配的文档

时间:2020-02-01 11:27:05

标签: mongodb

我正在尝试使用类似于以下结构的MongoDB集合进行过滤:

{
   Name: "My Item",
   Attributes: [{
        AttributeId: 1,
        Values: [{
               Name: "Book",
               P: 10
        },
        {
               Name: "Series",
               P: 100
        }] 
      },
      {   
        AttributeId: 2,
        Values: [{
              Name: "Pen",
              P: 10
        },
        {
              Name: "Dozen",
              P: 100
        }]
  }]
}

我要获取的所有文档的AttributeId:1并在其中包含一个名为“ Book”的值。

我已经尝试过该过滤器,但未返回任何结果:

{"ProductAttributeMappings.ProductAttributeId": 32,"ProductAttributeMappings.$.ProductAttributeValues.Name":"Book"}

2 个答案:

答案 0 :(得分:1)

如果我对您的理解正确,那么您正在尝试这样做:

此查询在Attributes数组中进行检查以匹配两个条件(Attribute == 32和Values.Name == Book)

db.ProductAttributeMappings.find({
  Attributes: {
    $elemMatch: {
      AttributeId: 32,
      Values: {
        $elemMatch: {
          Name: "Book"
        }
      }
    }
  }
})

MongoPlayground

但是,此查询在整个顶级文档中检查是否有数组满足查询条件:

db.ProductAttributeMappings.find({
  "Attributes.AttributeId": 32,
  "Attributes.Values.Name": "Book"
})

MongoPlayground

答案 1 :(得分:1)

您需要elemMatch运算符:

{Attributes: {$elemMatch: {AttributeId: 1, "Values.Name": "Book"}}}