我有这个活动行集合的例子
{
"_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,总计:xxxxx}
实际结果:
有什么解决方案吗?提前感谢
您的查询有两个问题:
- 您对每个单独的文档进行总和聚合,而不是对整个集合进行聚合,因为您指定了
_id: "$id",
,而需要指定_id: null
- 您正在执行集合中的
match
阶段,组阶段之后。但您需要在之前执行,因为分组后的结果如下:
{
"_id": null,
"total": 15
}
正如您所看到的,该对象没有原始对象所具有的任何字段,因此0
结果将匹配。阶段的顺序很重要,因为基本上每个阶段都会根据前一阶段的结果执行一些操作(mongodb自动优化阶段时也有一些例外,但这些阶段中的不同顺序不会产生不同的结果(。
所以查询应该是:
db.activities.aggregate(
[
{
$match: { type: "Expense", "user_hash": "asdsc4be9fe7xxx" }
},
{
$group:
{
_id: null,
total: { $sum: "$amount" }
}
},
]
)