Монго многоуровневая агрегатная группа - PullRequest
1 голос
/ 09 июня 2019

С учетом следующих данных после раскручивания в агрегате:

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

Я понимаю, как использовать группу и группировать ее сначала по клиенту, но потом яне понимаю, как создать массив вложенных химикатов, не испортив первоначальную группу клиентов.

Я пробовал что-то подобное, но мне не нравится внутренний $ 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"} } } } } } } }

Также хотел бы добавить общее количество на одного клиента и на работу

Ответы [ 2 ]

1 голос
/ 09 июня 2019

Чтобы сделать вложенные химикаты, вам просто нужно две $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

0 голосов
/ 11 июня 2019
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
            }
        },

    ]



);
...