聚合数组中的对象与多个条件匹配的文档

问题描述 投票:1回答:1

我有一个包含类似文件的集合:

{
    "_id": ObjectId("xxxxx"),
    "item": [
        { "property": ["attr1", "+1"] },
        { "property": ["attr2", "-1"] }
    ]
}

{
    "_id": ObjectId("xxxxy"),
    "item": [
        { "property": ["attr1", "-1"] },
        { "property": ["attr2", "0"] }
    ]
}

{
    "_id": ObjectId("xxxxz"),
    "item": [
        { "property": ["attr1", "0"] },
        { "property": ["attr2", "+1"] }
    ]
}

最好使用聚合管道,当且仅当任何一个属性与多个条件匹配时,有没有办法匹配文档?

例如,我想要一个查询,其中数组中的一个对象匹配以下两个条件:

("item.property": "attr1") AND ("item.property": /^\+/)

也就是说,它包含“attr1”的单个属性和以“+”开头的元素。

但是,使用我当前的查询,如下所示:

collection.aggregate(
    { $match:
        { $and: 
            [
                { "item.property": "attr1" },
                { "item.property": /^\+/ }
            ]
        }
    }

这将匹配第一个和最后一个文档,因为它们都包含具有“attr1”的属性和具有“+”的统计信息的元素。但是,我不希望此查询与最后一个文档匹配,因为以“+”开头的元素不属于数组中的同一对象。

有没有办法使用聚合框架来实现这种行为?

mongodb mongodb-query aggregation-framework
1个回答
1
投票

您可以使用以下查询与$elemMatch匹配数组的两个值。

就像是

db.collection_name.aggregate({
  "$match": {
    "item": {
      "$elemMatch": {
        "property.0": "attr1",
        "property.1": /^\+/
      }
    }
  }
});

此外,如果您不想引用数组索引,则可以使用$all运算符。

db.collection_name.aggregate({
  "$match": {
    "item": {
      "$elemMatch": {
        "property": {
          "$all": [
            "attr1",
            /^\+/
          ]
        }
      }
    }
  }
});
© www.soinside.com 2019 - 2024. All rights reserved.