Я новичок в 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"}
Большое спасибо за любую помощь.