MongoDB Orders/sales aggregation group Per Month Sum Total + Count Field

戏子无情 提交于 2021-02-05 06:48:25

问题


Who knows a better solution to group Orders by date and sum total and count by source. Of course I can group by Source and then I get only totals for this source only, I can alter the result thereafter to get the desired result. But I would like to know if it is possible in one simple $group statement.

Eg. ordersByApp = 1, ordersByWEB = 2

Orders collection

{
 _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'
}

My current aggregation

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

Current result

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

Desired result, How can I achieve the below?

[
  {
    _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:


You can use $cond like below:

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

Mongo Playground



来源:https://stackoverflow.com/questions/60067634/mongodb-orders-sales-aggregation-group-per-month-sum-total-count-field

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!