我有以下数据:
[
{
"result": {
"events": [
{
"amount": [
[
1623224700000,
"33333333"
],
[
1623224760000,
"33333333"
],
[
1623224820000,
"33333334"
]
],
}
],
}
}
]
在amount
中,第二个元素(str)是我需要求和的数量。
我的渠道:
db.collection.aggregate([
{
$addFields: {
"amount_sum": {
$sum: {
$map: {
input: "$result.events",
as: "events",
in: {
$map: {
input: "$events",
as: "event",
in: {
$toInt: {
$last: "$event.amount"
}
}
}
}
}
}
}
}
}
])
输出:
[
{
"_id": ObjectId("5a934e000102030405000000"),
"amount_sum": 0,
"result": {
"events": [
{
"amount": [
[
1.6232247e+12,
"33333333"
],
[
1.62322476e+12,
"33333333"
],
[
1.62322482e+12,
"33333334"
]
]
}
]
}
}
]
我已经搜索了每个(嵌套的)$map、$reduce question/answer,但不明白为什么没有结果。
使用嵌套的$unwind
(见下文)可以得到所需的结果,但我需要向原始文档添加一个字段。
db.collection.aggregate([
{
$unwind: "$result.events"
},
{
$unwind: "$result.events.amount"
},
{
$addFields: {
amount_sum: {
$sum: {
$toInt: {
$last: "$result.events.amount"
}
}
}
}
},
{
$group: {
_id: {
id: "$_id"
},
sum_amount: {
$sum: "$amount_sum"
}
}
}
])
输出:
[
{
"_id": {
"id": ObjectId("5a934e000102030405000000")
},
"sum_amount": 100000000
}
]
我在这里遗漏了什么神奇的MongoDB命令?
2条答案
按热度按时间vohkndzv1#
当前聚合不会创建数组,而是创建数组的数组,这与
$sum
运算符不兼容。你可以这样重构它:
Working example
7cjasjjr2#
如果可能,请考虑重构方案。目前,高度嵌套的方案和将数值存储为文本会使查询合成变得非常复杂。不过,您仍然可以继续使用分层的
$sum
和$map
来实现所需的功能。Mongo Playground