对于下面的查询,第一次聚合会产生空值,然后在第二阶段将其计为1,我们如何跳过从distinct计算空值
db.party.aggregate([
{ $group: { _id: “$party1.partyRole” } },
{ $count: “count” }
]);
第一阶段: { _id: “$party1.partyRole” } => _id: null
第二阶段: “计数” => 1
但是从第一阶段开始,如果只有空值,那么计数应该跳过它并显示为 0 而不是 1。
您可以保留当前的管道。只需在末尾添加一个
$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
}
])