Mongo 多级聚合组

use*_*362 4 mongodb mongodb-query aggregation-framework

给出汇总后展开的以下数据:

let workOrders = [
    {customer: 'A', job: 'Apple', chemical: {name: 'Chem A', quantity: 500}},
    {customer: 'A', job: 'Banana', chemical: {name: 'Chem B', quantity: 400}},
    {customer: 'A', job: 'Banana', chemical: {name: 'Chem C', quantity: 300}},
    {customer: 'B', job: 'Cherry', chemical: {name: 'Chem A', quantity: 200}}
]
Run Code Online (Sandbox Code Playgroud)

所需输出:

[
  {
    customer: 'A',
    jobs: [
      {
        job: 'Apple',
        chemicals: [
          {name: 'Chem A', quantity: 500}
        ]
      },
      {
        job: 'Banana',
        chemicals: [
          {name: 'Chem B', quantity: 400},
          {name: 'Chem C', quantity: 300}
        ]
      }
    ]
  },
  {
    customer: 'B',
    jobs: [
      {
        job: 'Cherry',
        chemicals: [
          {name: 'Chem A', quantity: 200}
        ]
      }
    ]
  }
]
Run Code Online (Sandbox Code Playgroud)

我首先了解如何使用组并按客户对其进行分组,但随后我不了解如何在不弄乱初始客户组的情况下制作嵌套化学品数组。

我尝试过类似的方法,但它不喜欢内部 $push。

{ "$group": { "_id": "$customer", "groups": { $push: { "group_data": "$customer", "group_count": {$sum: "$customer"}, "group_child": { $push: { "group_data": "$job", "group_count": {$sum: "$job"}, "group_children": { $push: { "group_data": "$chemical.name", "group_count": {$sum: "$chemical.name"} } } } } } } }

还想添加每个客户和每个工作的总数量

mic*_*ckl 7

要制造嵌套化学品,您只需要两个$group阶段:

    db.collection.aggregate([
    {
        $group: {
            _id: { customer: "$customer", job: "$job" },
            chemicals: { $push: "$chemical" },
            jobTotal: { $sum: "$chemical.quantity" }
        }
    },
    {
        $group: {
            _id: "$_id.customer",
            jobs: { $push: { job: "$_id.job", jobTotal: "$jobTotal", chemicals: "$chemicals" } },
            customerTotal: { $sum: "$jobTotal" }
        }
    },
    {
        $project: {
            _id: 0,
            customer: "$_id.customer",
            customerTotal: 1,
            jobs: 1
        }
    }
])
Run Code Online (Sandbox Code Playgroud)

蒙戈游乐场