匹配多个条件的情况下,聚合与数组对象匹配的文档

9

我有一个类似以下的文档集合:

{
    "_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”的属性和以“+”开头的元素。但是,我不希望此查询匹配最后一个文档,因为以“+”开头的元素不属于数组中相同的对象。

是否有任何方法可以使用聚合框架实现此行为?

1个回答

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

类似这样的:

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

此外,如果您不想引用数组索引,您还可以使用$all操作符。

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

这个在聚合操作中不起作用,对吧? - coiso

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接