【问题标题】:MongoDB: Null check in between Pipeline StagesMongoDB:管道阶段之间的空签入
【发布时间】:2019-09-01 21:16:59
【问题描述】:

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

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-stage 之间添加某种空值检查。

【问题讨论】:

  • 检查结果是否为空数组,如[]。这是唯一的方法。
  • @AshwanthMadhav:我该如何检查?在一个单独的阶段?或者我能不能把“IfNull”融入小组赛?
  • 你在使用环回吗?我将使用 loopback 为节点提供 ma 代码

标签: mongodb mongodb-query


【解决方案1】:

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

如果您可以提供一系列示例,则更容易详细说明答案。

编辑:如果您按名称分组,“John”的结果是一个,因为“Clarice”是一个正确的空数组,这里是聚合查询:

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

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

【讨论】:

  • 我知道“ifNull”,但表达式是什么?如何引用舞台的输入?
  • 但是如果我要数一些东西并且没有这个东西的实体,那么正确的答案是 0。不是null or no answer` ...
  • 一个空数组作为响应对我来说很好,因为意味着 0。Null 意味着错误
【解决方案2】:

只需使用count

db. People.count({Name:"John"}) 这将返回确切的数字。

否则,您需要检查结果是否为空数组。下面是node使用loopback的代码,

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})
})

【讨论】:

  • 这似乎是一个如此简单的用例,我无法想象它没有解决方案......:/
  • 我想你会选择 count 而不使用 aggregation
【解决方案3】:

必须使用$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 的类似答案

【讨论】:

  • 这在 MongoDB 上效果很好,显然是一个正确的答案。遗憾的是,我忘了说明我不是在使用 MongoDB,而是在 CosmosDB 上工作,遗憾的是微软还没有实现 facet-aggregate:/
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-17
  • 2019-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-07
  • 1970-01-01
相关资源
最近更新 更多