【问题标题】:Mongodb Sum query returns nothingMongodb Sum 查询不返回任何内容
【发布时间】:2020-07-19 15:31:24
【问题描述】:

我有这个活动行集合的例子

{
  "_id" : ObjectId("5ec90b5258a37c002509b27d"), 
  "user_hash" : "asdsc4be9fe7xxx", 
  "type" : "Expense", 
  "name" : "Lorem", 
  "amount" : 10000, 
  "date_created" : 1590233938 
}

我想用这个聚合代码收集活动的总金额

db.activities.aggregate(
  [
    {
      $group: 
        {
          _id: "$id", 
          total: { $sum: "$amount" } 
        } 
    }, 
    { 
      $match: { type: "Expense", "user_hash": "asdsc4be9fe7xxx" } 
    } 
  ] 
)

预期结果:{_id: null, total: xxxxx }

实际结果:

有什么解决办法吗?提前谢谢你

【问题讨论】:

  • 您必须将$match 阶段放在$group 阶段之前。在$group 阶段之后。剩下的唯一字段是_idtotal

标签: javascript mongodb


【解决方案1】:

您的查询有 2 个问题:

  1. 您对每个单独的文档进行总和聚合,而不是对整个集合进行聚合,因为您指定了_id: "$id",,而您需要指定_id: null
  2. 您正在小组赛之后的聚合中执行match 阶段。但是您需要在之前执行它,因为在您分组之后,结果将类似于:
{
  "_id": null,
  "total": 15
}

如您所见,此对象没有原始对象所具有的任何字段,因此0 结果将被匹配。阶段的顺序很重要,因为基本上每个阶段都会根据前一个阶段的结果执行一些操作(当mongodb自动optimizes阶段时会有一些例外,但这些阶段的不同顺序不会产生不同的结果)。

所以查询应该是:

db.activities.aggregate(
  [
    { 
      $match: { type: "Expense", "user_hash": "asdsc4be9fe7xxx" } 
    },
    {
      $group: 
        {
          _id: null, 
          total: { $sum: "$amount" } 
        } 
    },
  ] 
)

【讨论】:

  • 感谢@Yos 的明确解释,它按预期工作。我不知道操作的顺序实际上很重要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-14
  • 2017-07-13
  • 1970-01-01
  • 2021-04-24
相关资源
最近更新 更多