MongoDB 用于查找布尔值的聚合管道

MongoDB aggregation pipeline to find boolean value

我想找出集合中的所有匹配文档,其中 MatchConditionfalse。我正在尝试使用匹配运算符在聚合管道中执行此操作,但这不起作用。

{
    "_id": {
        "$oid": "98rr6c03a82b7785f372c018"
    },
    "document": "DocumentName",
    "ecuCheckResultList": [
      {
        "animal": "CAT",
        "attribute1": "value",
        "attribute2": "value",
        "MatchCondition": true
      },
      {
        "animal": "DOG",
        "attribute1": "value",
        "MatchCondition": false
      }
    ]
  }

我知道可以使用查找来执行此操作,但是需要对这些数据进行单独的操作,因此使用聚合管道。

最后,我需要找出集合中每只动物的总计数 MatchCondition = false

我的集合中有超过 190 万个文档,我想查询这些文档。

您可以$map构造一个辅助布尔数组来检查MatchCondition是否为假。对于您的情况,一个简单的 $not 将起作用,因为它可以将 false 翻转为 true。然后,使用$anyElementTrue进行过滤。

db.collection.aggregate([
  {
    "$match": {
      $expr: {
        "$anyElementTrue": {
          "$map": {
            "input": "$ecuCheckResultList.MatchCondition",
            "as": "mc",
            "in": {
              $not: "$$mc"
            }
          }
        }
      }
    }
  }
])

这里是Mongo playground供您参考。

查询 1

  • unwind 替换 root 使每个成员成为根文档
  • 匹配条件为假
  • 按 anima 分组并计数

Playmongo
(对于每个阶段in/out,您可以将鼠标放在阶段的尽头)

aggregate(
[{"$unwind": "$ecuCheckResultList"},
 {"$replaceRoot": {"newRoot": "$ecuCheckResultList"}},
 {"$match": {"$expr": {"$eq": ["$MatchCondition", false]}}},
 {"$group": {"_id": "$animal", "count": {"$sum": 1}}}])

查询2

  • 与上面相同,但首先过滤以仅保留条件 false 并在
  • 之后放松

*可能比之前更快

Playmongo

aggregate(
[{"$set": 
   {"ecuCheckResultList": 
     {"$filter": 
       {"input": "$ecuCheckResultList",
        "cond": {"$eq": ["$$this.MatchCondition", false]}}}}},
 {"$unwind": "$ecuCheckResultList"},
 {"$group": {"_id": "$ecuCheckResultList.animal", "count": {"$sum": 1}}}])