【问题标题】:Having trouble wrapping my head around complex $group'ing/aggregation难以理解复杂的 $group'ing/aggregation
【发布时间】:2017-03-12 10:38:09
【问题描述】:

我有一个类似这样的架构:

{
  _id: <objectid>
  customer: <objectid>
  employee: <objectid>
  date: <Month/day/year>
  amount: <Number>
}

使用 Angular,我正在尝试制作一个页面,该页面可以提取该数据并为每天构建单独的表格。所以就像我昨天会有一个标签,它会打开一个表格的视图,其中列出了我所有的员工以及他们当天的总和。像这样的:

[{
  date: 10/29/2019
  dataFromThisDate: [
    {
      employee: <name>
      sumAmount: <sum(amount for this date)>
      list:  [<array of all of the transaction _ids 
    },
    {
      employee: <name 2> 
      //etc
    }]
 },
 {
   date: 10/30/2019
   dataFromThisDate: //etc
 }]

据我所知,基本上是:

MyCollection.aggregate(
  [{
    $group: {
       _id: "$date"
    }
  }],function(err, result) { //blah }
)

但我什至不确定如何进行嵌套分组(首先按日期,然后按该日期的员工)。仔细想想,感觉就像我必须按日期分组,然后将所有数据传递到新的分组管道?

抱歉,我没有更多我尝试过的东西,整个聚合对我来说是全新的,我找不到与我想要学习的东西足够相似的好例子.我查看了 mongodb 的 api 文档,我了解了他们的基本示例并使用了它们,但我只是很难想出如何做更复杂的示例。

【问题讨论】:

    标签: javascript mongodb mongoose mongodb-query aggregation-framework


    【解决方案1】:

    你可以试试这样的。这使用两个组。第一个按日期和员工分组,合计金额并添加交易 ID。第二组按日期添加员工及其总金额和交易列表。

    aggregate([{
        $group: {
            _id: {
                date: "$date",
                employee: "$employee"
            },
            amount: {
                $sum: "$amount"
            },
            transactionIds: {
                $push: "$_id"
            }
        }
    }, {
        $group: {
            _id: "$_id.date",
            dataFromThisDate: {
                $push: {
                    employee: "$_id.employee",
                    sumAmount: "$amount",
                    list: "$transactionIds"
                }
            }
        }
    }])
    

    输出

     {
        "_id": "12/21/2016",
        "dataFromThisDate": [{
            "employee": "employee1",
            "sumAmount": 100,
            "list": [ObjectId("58151e881ac3c9ce82782663")]
        }, {
            "employee": "employee2",
            "sumAmount": 73,
            "list": [ObjectId("58151e881ac3c9ce82782665"), ObjectId("58151e881ac3c9ce82782666")]
        }]
     }
    

    【讨论】:

    • 谢谢!抱歉花了这么长时间才回到这个问题上,但效果很好!
    猜你喜欢
    • 2017-08-30
    • 2021-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-22
    • 1970-01-01
    • 2010-10-28
    • 2014-11-15
    相关资源
    最近更新 更多