MongoDB Заказы / группа агрегации продаж в месяц Сумма Итого + Поле количества - PullRequest
2 голосов
/ 05 февраля 2020

Кто знает лучшее решение для группировки заказов по дате и итоговой сумме и подсчета по источникам. Конечно, я могу группировать по источникам, а затем я получаю только итоги только для этого источника, после чего я могу изменить результат, чтобы получить желаемый результат. Но я хотел бы знать, возможно ли это в одном простом $group утверждении.

Например. ordersByApp = 1, ordersByWEB = 2

Коллекция заказов

{
 _id: 'XCUZO0',
 date: "2020-02-01T00:00:03.243Z"
 total: 9.99,
 source: 'APP'
},
{
 _id: 'XCUZO1',
 date: "2020-01-05T00:00:03.243Z"
 total: 9.99,
 source: 'WEB'
},
{
 _id: 'XCUZO2',
 date: "2020-01-02T00:00:03.243Z"
 total: 9.99,
 source: 'WEB'
}

Моя текущая агрегация

Order.aggregate([
   {
     $group: {
        _id: {
           month: { $month: "$date",
           year: { $year: "$date" } 
        },
        total: {
           $sum: "$total"
        } 
     }
   }
])

Текущий результат

[
  {
    _id: { month: 01, year: 2020 },
    total: 19.98
  },
  {
    _id: { month: 02, year: 2020 },
    total: 9.99
  }
]

Желаемый результат, Как мне достичь ниже?

[
  {
    _id: { month: 01, year: 2020 },
    total: 19.98,
    countByApp: 1, <---
    countByWEB: 0, <---
  },
  {
    _id: { month: 02, year: 2020 },
    total: 9.99,
    countByWEB: 2, <---
    countByAPP: 0  <---
  }
]

1 Ответ

3 голосов
/ 05 февраля 2020

Вы можете использовать $ cond , как показано ниже:

Order.aggregate([
    {
        $group: {
            _id: {
                month: { $month: "$date" },
                year: { $year: "$date" } 
            },
            total: { $sum: "$total" },
            countByApp: { $sum: { $cond: [ {$eq: [ "$source", "APP" ]} , 1, 0] } },
            countByWeb: { $sum: { $cond: [ {$eq: [ "$source", "WEB" ]} , 1, 0] } },
        }
    }
])

Пн go Детская площадка

...