Mongodb 创建$group时,如何返回所有对象中存在的属性的总和?
我有一个具有以下结构的数据库:Mongodb 创建$group时,如何返回所有对象中存在的属性的总和?,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我有一个具有以下结构的数据库: [ { "provider": "provider 1", "debts": [ { "debt": 500, "paid": true }, { "debt": 900, "paid": false
[
{
"provider": "provider 1",
"debts": [
{
"debt": 500,
"paid": true
},
{
"debt": 900,
"paid": false
},
{
"debt": 600,
"paid": false
}
]
},
{
"provider": "provider 2",
"debts": [
{
"debt": 500,
"paid": false
}
]
}
]
我希望每个对象仅当paid
属性为false时,才将债务
数组(债务.债务
)中包含的债务
字段的总和存储在总计
字段中。(在我的真实代码中,它在这里运行良好)
如何获得满足上述条件的所有对象中包含的total
属性的总和
{
"debts_providers": [
{
"_id": "5f29af0a17196c1624f7dd88",
"total": 1500
},
{
"_id": "5f29af0a17196c1624f7dd89",
"total": 500
}
],
"sum_total_objects": 2000 /*900+600+500*/
}
您不需要使用
$unwind
-最好使用来处理一个数组,该数组仅用于汇总未付的债务。然后需要得到一个总值:
db.collection.aggregate([
{
$project: {
_id: 1,
total: {
$reduce: {
input: "$debts",
initialValue: 0,
in: {
$add: [ "$$value", { $cond: [{ $eq: ["$$this.paid", false] }, "$$this.debt", 0] } ]
}
}
}
}
},
{
$group: {
_id: null,
debt_providers: { $push: "$$ROOT" },
sum_total_objects: { $sum: "$total" }
}
}
])
您的思路是正确的,只需将root替换为债务提供者
- 您在第一组中错过了
$
,$cond
然后是部分,它应该是$deborts.debt
- 所需的第二个
$group
,
- 创建新字段
debt\u providers
并推送$$ROOT
,因为文档是独立展开的,但我们需要在debt\u providers中一起设置
- 创建新字段
sum\u total\u对象
到$sum
所有总值
游乐场:
db.collection.aggregate([
{
$project: {
_id: 1,
total: {
$reduce: {
input: "$debts",
initialValue: 0,
in: {
$add: [ "$$value", { $cond: [{ $eq: ["$$this.paid", false] }, "$$this.debt", 0] } ]
}
}
}
}
},
{
$group: {
_id: null,
debt_providers: { $push: "$$ROOT" },
sum_total_objects: { $sum: "$total" }
}
}
])
db.collection.aggregate([
{
$unwind: "$debts"
},
{
$group: {
_id: "$_id",
total: {
$sum: {
$cond: [
{ $eq: ["$debts.paid", false] },
"$debts.debt", // corrected debts.debt to $debts.debt
0
]
}
}
}
},
// added here
{
$group: {
_id: null,
debt_providers: { $push: "$$ROOT" },
sum_total_objects: { $sum: "$total" }
}
}
])