javascript - 无法理解复杂的 $group'ing/aggregation

标签 javascript mongodb mongoose mongodb-query aggregation-framework

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

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

使用 Angular ,我试图制作一个页面来提取该数据并为每天构建单独的表。因此,就像我昨天会有一个选项卡一样,这将打开一个表的 View ,其中列出了我的所有员工及其当天的总和。像这样的事情:

[{
  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 文档,了解了它们的基本示例并尝试了它们,但我很难想出如何完成更复杂的示例。

最佳答案

你可以尝试这样的事情。这使用了两个组。首先按日期和员工分组,汇总金额并添加交易 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")]
    }]
 }

关于javascript - 无法理解复杂的 $group'ing/aggregation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40323663/

相关文章:

javascript - 通过 Angular 访问对象

javascript - d3.pack() 转换更新

node.js - 如果数据库关闭一段时间,MongoDB 会更改流超时

javascript - Mongoose 填充嵌入式

mongodb - Meteor:如何在启动时删除所有 Mongo 集合并清除所有数据?

c# - 字段的 MongoDB C# 驱动程序投影

regex - 为 Mongoose URI 创建正则表达式

javascript - 如何重新启用禁用的谷歌地图 v3 拖放、缩放等

javascript - 用于检查 JavaScript 语法的 Firefox 附加工具?

javascript - 为什么我的 Angular 测试不像我的自定义表单验证功能?