如果我这样创建一个集合:
db.People.insert({"Name": "John"})
并运行一个简单的mongo聚合,如下所示:
db.People.aggregate([{$match: {Name: "John"}}, {$group: {_id: "null", count: {$sum: 1}}}])
这将计算集合中的所有Johns并返回
{ "_id" : "null", "count" : 1 }
哪个好。但是,如果我搜索根本不存在的名称“ Clarice”,它将返回null
。
我希望它返回
{ "_id" : "null", "count" : 0 }
我还没有找到实现此目标的方法。我将不得不在$match
-和$group
阶段之间包含某种空检查。
答案 0 :(得分:1)
只需使用count
db. People.count({Name:"John"})
这将返回确切的数字。
否则,您需要检查结果是否为空数组。以下是使用环回的节点代码,
db.People.aggregate([
{$match: {Name: "John"}},
{$group: {_id: "null", count: {$sum: 1}}}
],(err,res)=>{
if(err) return cb(err)
if(res.length) return cb(err,res)
else return cb(err,{_id:null,count:0})
})
答案 1 :(得分:1)
db.People.aggregate([
{ "$facet": {
"array": [
{ "$match": { Name:"John" }},
{ "$group": {
"_id": null,
"count": { "$sum": 1 }
}},
{ "$project": { "_id": 0, "count": 1 }}
]
}},
{ "$project": {
"count": {
"$ifNull": [{ "$arrayElemAt": ["$array.count", 0] }, 0 ]
}
}}
])
输出:
{ "count" : 1 }
其他名称应为:
{ "count" : 0 }
答案 2 :(得分:0)
您可以在$ match阶段使用$ifNull。
如果您可以提供示例集合,则更容易确定答案。
编辑:如果按名称分组,则“约翰”的结果为1,对于“克拉丽斯”的结果为正确的空数组,此处为聚合查询:
db.People.aggregate([
{
$match: { Name: "John" }
},
{
$group: { _id: "$Name", count: { $sum: 1 } }
}
])