【问题标题】:Mongo aggregate match + group with sum - return 0 if no matchesMongo 聚合匹配 + 总和组 - 如果没有匹配则返回 0
【发布时间】:2021-09-05 08:37:06
【问题描述】:

见playground。这是查询:

db.collection.aggregate([
  {
    $match: {
      time: {
        $gte: 20,
        $lte: 40
      }
    }
  },
  {
    $group: {
      _id: null,
      amount: {
        $sum: "$amount"
      }
    }
  },
  {
    $project: {
      _id: 0,
      amount: 1
    }
  }
])

如果没有找到匹配,它只返回一个空数组。我希望它返回[{amount: 0}],即使没有匹配。怎么可能?

【问题讨论】:

  • 不要使用匹配查询,而是在$sum 中应用$cond。通过在匹配查询中应用条件,您将这些文档限制在下一阶段。让我知道想要相同的代码
  • 是的,你能举个例子吗?
  • 添加了一个答案,看看是不是你要找的。​​span>

标签: mongodb mongoose aggregation-framework


【解决方案1】:

删除$match 管道并在$sum 中添加$cond 以处理所有记录。

db.collection.aggregate([
  {
    $group: {
      _id: null,
      amount: {
        $sum: {
          "$cond": {
            "if": {
              "$and": [
                {
                  "$gte": [
                    "$amount",
                    20
                  ]
                },
                {
                  "$lte": [
                    "$amount",
                    40
                  ]
                },
              ]
            },
            "then": "$amount",
            "else": 0,
          }
        }
      }
    }
  },
  {
    $project: {
      _id: 0,
      amount: 1
    }
  }
])

Mongo Playground Sample Execution

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-07
    • 2021-10-18
    • 1970-01-01
    • 2019-04-28
    • 1970-01-01
    • 1970-01-01
    • 2012-11-27
    • 1970-01-01
    相关资源
    最近更新 更多