$group 和 $count 查询上的聚合应在返回 count 时跳过空值

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

对于下面的查询,第一次聚合会产生空值,然后在第二阶段将其计为1,我们如何跳过从distinct计算空值

db.party.aggregate([
{ $group: { _id: “$party1.partyRole” } },
{ $count: “count” }
]);

第一阶段: { _id: “$party1.partyRole” } => _id: null

第二阶段: “计数” => 1

但是从第一阶段开始,如果只有空值,那么计数应该跳过它并显示为 0 而不是 1。

aggregation stage

mongodb aggregation-framework
1个回答
0
投票

您可以保留当前的管道。只需在末尾添加一个

$unionWith
阶段即可附加
count: 0
文档。然后,执行
$limit: 1
选择第一个文档。如果有非空结果,则将其作为第一个文档并返回计数结果。如果只有空结果,它将拾取我们附加的
count: 0
文档。

db.collection.aggregate([
  {
    $group: {
      _id: "$party1.partyRole"
    }
  },
  {
    "$match": {
      _id: {
        $ne: null
      }
    }
  },
  {
    "$count": "count"
  },
  {
    "$unionWith": {
      "coll": "collection",
      "pipeline": [
        {
          "$documents": [
            {
              "count": 0
            }
          ]
        }
      ]
    }
  },
  {
    "$limit": 1
  }
])

Mongo Playground 只有空结果
Mongo Playground 具有非空结果

© www.soinside.com 2019 - 2024. All rights reserved.