Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 创建$group时,如何返回所有对象中存在的属性的总和?_Mongodb_Aggregation Framework - Fatal编程技术网

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" }
    }
  }
])