MongoDB Grouping Array Элементы уже сгруппированных документов - PullRequest
0 голосов
/ 30 августа 2018

Я новичок в 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"}

Большое спасибо за любую помощь.

...