【问题标题】:How do I count the number of true Boolean values inside an array within a collection and group by job in MongoDB?如何在 MongoDB 中按作业计算集合中数组内的真实布尔值的数量?
【发布时间】:2021-10-27 10:20:17
【问题描述】:

给定:给我一个包含批次信息的集合。

期望:我需要返回作业的真实值的数量。

一些上下文:每个作业都被分成多个批次。在集合中:labellers 包含一个数组,其中labeller 是用户,完成表示是否有人完成了批处理,_id 指的是批处理 ID,作业包含 _id特定的工作。

所以我知道我需要放松并按作业分组,但我似乎无法让我的查询返回正确数量的真值。

收藏:

 {
    "_id": ObjectId("612370c2abbe776854d8c0ec"),
    "batch_number": 0,
    "job": ObjectId("612370c1abbe777ae8d8c0eb"),
    "labellers": [
      {
        "labeller": ObjectId("61238ed4abbe77763ed8c100"),
        "completed": true
      },
      {
        "labeller": ObjectId("61238f2babbe77c838d8c101"),
        "completed": true
      }
    ],
    "__v": 0
  },
  {
    "_id": ObjectId("612370c2abbe771a75d8c0ed"),
    "batch_number": 1,
    "job": ObjectId("612370c1abbe777ae8d8c0eb"),
    "labellers": [
      {
        "labeller": ObjectId("61238ed4abbe77763ed8c100"),
        "completed": true
      },
      {
        "labeller": ObjectId("61238f2babbe77c838d8c101"),
        "completed": false
      }
    ],
    "__v": 0
  }

期望的输出

{
    "_id": ObjectId("612370c1abbe777ae8d8c0eb"),
    "count": 3
  }

我尝试过的:

db.collection.aggregate({
  $unwind: "$labellers"
},
{
  $group: {
    _id: "$job",
    count: {
      $sum: {
        $cond: [
          {
            "labellers": {
              "completed": true
            }
          },
          1,
          0
        ]
      }
    }
  }
})

我尝试过的输出:

{
    "_id": ObjectId("612370c1abbe777ae8d8c0eb"),
    "count": 4
  }

【问题讨论】:

    标签: mongodb mongoose mongodb-query aggregation-framework


    【解决方案1】:

    我在$group 之前添加$match 并从$group 中删除$cond

    [
      {
        '$match': {
          'job': '612370c1abbe777ae8d8c0eb'
        }
      }, {
        '$unwind': {
          'path': '$labellers'
        }
      }, {
        '$match': {
          'labellers.completed': true
        }
      }, {
        '$group': {
          '_id': '$job', 
          'count': {
            '$sum': 1
          }
        }
      }
    ]
    

    【讨论】:

      【解决方案2】:
      • $filter 迭代 labellers.completed 布尔数组的循环并过滤真实结果
      • $size 获取上述过滤操作中返回的总元素
      • $group by job 和总元素计数
      db.collection.aggregate([
        {
          $group: {
            _id: "$job",
            count: {
              $sum: {
                $size: {
                  $filter: {
                    input: "$labellers.completed",
                    cond: "$$this"
                  }
                }
              }
            }
          }
        }
      ])
      

      Playground

      【讨论】:

      • 感谢您的回答,效果非常好。只是出于兴趣,如果我想计算错误,这将如何改变,我厌倦了在 cond 行中使用 $ne 并且它不起作用。
      • 您可以使用$not 运算符作为否定条件,playground
      猜你喜欢
      • 2023-04-02
      • 2013-05-01
      • 1970-01-01
      • 2016-04-08
      • 1970-01-01
      • 2011-11-03
      • 2017-01-02
      • 2012-07-28
      • 1970-01-01
      相关资源
      最近更新 更多