已分组文档的MongoDB分组数组元素

时间:2018-08-30 09:53:18

标签: mongodb mongodb-query aggregation-framework grouping

我是MongoDB的新手,我试图对已经分组的文档中的数组元素进行分组(我想保留第一个分组)。

我有以下基本文件:

{
  user: "user_a",
  upload_folder: "folder_x",
  created_at: "2018-08-30 00:00:00",
  volume: 25678
},
{
  user: "user_a",
  upload_folder: "folder_x",
  created_at: "2018-08-29 00:00:00",
  volume: 567
},
{
  user: "user_b",
  upload_folder: "folder_a",
  created_at: "2018-08-30 00:00:00",
  volume: 25678
}

我想获得一个结果,该结果首先按日期分组(以获取每天所有传输的数量和数量),然后按用户和文件夹分组,以获取有关每个用户的传输数量和每个用户的数量的信息。

最终结果应如下所示:

[
 _id: {month:08, day:30, year: 2018},
 totalVolume: 51356,
 totalTransfers: 1,
 users: [
  {
   name:user_a,
   transfersPerUser:1,
   volumePerUser:25678,
   destinations:[
     folder: "folder_x",
     transfersPerDestination: 1,
     volumePerDestination: 25678
   ]
  }
 ]
]

对我来说,第一个问题是:在一个查询中这样做是否有意义,或者我走错了路线?

我已经拥有的是每个日期的分组以及每天的交易量和总和。 但是我不知道如何进行第二次分组,因为每个用户的每次单次传输都在一个数组中。

我试图对数组执行$ unwire并将每个未连接的条目分组。但是如何将结果添加到按日期分组的原始文档中?

获取日期范围内的结果:

$match: {
        creationDate: {
            $gte: ISODate('2018-08-01 00:00:00'),
            $lte: ISODate('2018-08-31 00:00:00')
        }
}

按日期分组结果

{
    $group: {
        _id: {
            month: {
                $month: "$created_at"
            },
            day: {
                $dayOfMonth: "$created_at"
            },
            year: {
                $year: "$created_at"
            },
        },
        uploads: {
            $push: {
                "user": "$user",
                "upload_folder": "$upload_folder",
                "volume": "$volume"
            }
        },
        volumPerDay: {
            $sum: "$volume"
        },
        transfersPerDay: {
            $sum: 1
        }
}

我该如何进行?然后使用$unwind

$unwind { path: "$user"}

非常感谢您的帮助。

0 个答案:

没有答案