与最后一个mongodb一起使用Sum
用例:我有以下数据:与最后一个mongodb一起使用Sum,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,用例:我有以下数据: {"accountNumber":"1-1", "details":["version":{ "number": "1","accountGroup":"1", "editable":"false" , "amount":100 }]} {"accountNumber":"1-2", "details":[version":{ "number": "2", "accountGroup":"1", "editable":"false" , "amount":200}]} {
{"accountNumber":"1-1", "details":["version":{ "number": "1","accountGroup":"1", "editable":"false" , "amount":100 }]}
{"accountNumber":"1-2", "details":[version":{ "number": "2", "accountGroup":"1", "editable":"false" , "amount":200}]}
{"accountNumber":"2-1", "details":[version":{ "number": "1", "accountGroup":"2", "editable":"false", "amount":200 }]}
其中:我的文件是帐户。每个记录都有一个accountGroup 1、2。一个组可以有多个版本。AccountNumber正在由AccountGroup和version的组合进行初始化
我想获得账号1-2和2-1的最新版本以及它们的金额总和
预期产出:
我正在使用以下查询:
db.getCollection('account').aggregate([
{ "$sort": { "accountNumber": 1 } },
{ "$unwind": "$details"},
{ "$group": {
"_id": "$details.version.accountGroup",
"Latestversion": { "$last": "$$ROOT" },
"total": {
$sum: "$details.version.amount"
}
}
}])
它获取属于一个组的所有版本的总和
电流输出:
我是Mongodb的新手,非常感谢您的帮助。期待您的回复。您需要两个$group阶段
第一个$组查找每个帐户组的最新文档,第二个$组汇总最新文档中的金额
差不多
aggregate([
{ "$sort": { "accountNumber": 1 } },
{ "$unwind": "$details"},
{ "$group": {
"_id": "$details.version.accountGroup",
"latest": { "$last": "$$ROOT" }
}
},
{ "$group": {
"_id": null,
"accountNumbers": { $push:"$latest.accountNumber" },
"total": { $sum: "$latest.details.version.amount" }
}
}
])
您可以将结构更新到下面并删除$unwind
谢谢,这个石头。
{"accountNumber": "1-2", total: 300}, {"accountNumber":"2-1", total: 200}
aggregate([
{ "$sort": { "accountNumber": 1 } },
{ "$unwind": "$details"},
{ "$group": {
"_id": "$details.version.accountGroup",
"latest": { "$last": "$$ROOT" }
}
},
{ "$group": {
"_id": null,
"accountNumbers": { $push:"$latest.accountNumber" },
"total": { $sum: "$latest.details.version.amount" }
}
}
])
{"accountNumber":"1-1", detail:{"number": "1","accountGroup":"1", "editable":"false" , "amount":100 }}