[英]MongoDB nested map aggregation to sum a array element
我有以下数据:
[
{
"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 问题/答案,但无法弄清楚为什么这不会产生结果。
使用嵌套的$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 命令是什么?
如果可能,请考虑重构您的架构。 目前,高度嵌套的模式和将数字存储为文本给查询组合带来了高复杂性。 尽管如此,您仍然可以继续使用分层的$sum
和$map
来实现您的需要。
db.collection.aggregate([
{
$addFields: {
"amount_sum": {
$sum: {
"$map": {
"input": "$result.events",
"as": "e",
"in": {
$sum: {
"$map": {
"input": "$$e.amount",
"as": "a",
"in": {
$toInt: {
"$arrayElemAt": [
"$$a",
1
]
}
}
}
}
}
}
}
}
}
}
])
您当前的聚合不会创建一个数组,而是一个数组的数组,这与$sum
运算符不兼容。
您可以像这样重构它:
db.collection.aggregate([
{
$set: {
"amount_sum": {
$sum: {
$first: {
$map: {
input: "$result.events",
as: "event",
in: {
$map: {
input: "$$event.amount",
as: "amount",
in: {
$toInt: {
$last: "$$amount"
}
}
}
}
}
}
}
}
}
}
])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.