【问题标题】:Mongo Multiple Level Aggregate GroupMongo 多级聚合组
【发布时间】:2019-06-09 19:49:38
【问题描述】:

综合展开后给出以下数据:

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

需要输出:

[
  {
    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}
        ]
      }
    ]
  }
]

我了解如何使用 group 并首先按客户分组,但是我不明白如何在不弄乱初始客户组的情况下制作嵌套化学品数组。

我试过这样的东西,但它不喜欢内部的 $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"} } } } } } } }

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

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

    要制作嵌套化学品,您只需要两个 $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
            }
        }
    ])
    

    Mongo Playground

    【讨论】:

    • 如果我想获得每个客户和工作的化学数量总和和平均值,我该如何实现?需要Customer A总和=1200,还需要job Apple总和=500,job Banana总和=700?
    • @user1779362 修改了我的答案
    • 我最终做了 3 个组,将所有 3 个用作 _id,然后 2 个然后 1 个,边走边将数组堆叠在里面。这样我就可以在每种化学品下面从我想要的集合中获取更多数据。你的例子教会了我我需要什么,谢谢
    【解决方案2】:
    db.collection.aggregate(
    
        // Pipeline
        [
            // Stage 1
            {
                $group: {
                 _id:{job:'$job'},
                 chemicals:{$push:'$chemical'},
                 docObj:{$first:'$$CURRENT'}
    
                }
            },
    
            // Stage 2
            {
                $group: {
                    _id:{customer:'$docObj.customer'},
                    jobs:{$push:{job:'$_id.job',chemicals:'$chemicals'}}
    
                }
            },
    
            // Stage 3
            {
                $project: {
                   customer:'$_id.customer',
                   jobs:1,
                   _id:0
                }
            },
    
        ]
    
    
    
    );
    

    【讨论】:

      猜你喜欢
      • 2020-08-26
      • 2016-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-24
      • 1970-01-01
      • 2015-05-04
      相关资源
      最近更新 更多