MongoDB:在管道阶段之间空检查

时间:2019-04-11 09:24:57

标签: mongodb mongodb-query

如果我这样创建一个集合:

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阶段之间包含某种空检查。

3 个答案:

答案 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)

必须与运营商$facet一起使用$ifNull聚合。例如:

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 }

$addFields when no $match found相似的答案

答案 2 :(得分:0)

您可以在$ match阶段使用$ifNull

如果您可以提供示例集合,则更容易确定答案。

编辑:如果按名称分组,则“约翰”的结果为1,对于“克拉丽斯”的结果为正确的空数组,此处为聚合查询:

db.People.aggregate([
    { 
        $match: { Name: "John" } 

    }, 
    { 
        $group: { _id: "$Name", count: { $sum: 1 } } 
    }
])