首页 > 解决方案 > 已分组文档的 MongoDB 分组数组元素

问题描述

我是 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"}

非常感谢您的帮助。

标签: mongodbmongodb-queryaggregation-frameworkgrouping

解决方案


推荐阅读