Несколько групп в агрегированном конвейере mongodb
У меня есть коллекция, которая содержит данные, такие как:
{
attribute: 'value',
date: ISODate("2016-09-20T18:51:05Z")
}
и я хочу сгруппировать attribute
чтобы получить общее количество по атрибуту и в то же время сгруппировать по attribute
а также $hour
чтобы получить счет за атрибут и час.
Я знаю, что могу сделать что-то вроде:
{
$group: {
_id: '$attribute'
count: {
$sum: 1
}
}
}
а также
{
$group: {
_id: {
attribute : '$attribute',
hour: {
'$hour' : '$date'
}
},
count: {
$sum: 1
}
}
},
{
$group: {
_id: {
attribute: '$_id.attribute'
},
hours: {
'$push': {
hour: '$_id.hour',
count: '$count'
}
}
}
}
чтобы получить оба результата в двух отдельных агрегатах, но есть ли способ получить желаемый результат в одном запросе?
Редактировать по запросу:
Возможно, это совершенно неправильно, но в идеале я хотел бы получить ответ:
{
_id: "attribute1",
total: 20, // Total number of attribute1 documents
// And the breakdown of those 20 documents per hour
hours: [{
hour: 10,
count: 8
},
{
hour: 14,
count: 12
}]
}
Однако весь вопрос заключается в том, можно ли это сделать (и каким образом) по одному запросу в mongodb. Не в двух запросах, которые будут объединены на прикладном уровне
1 ответ
Вы можете сначала сгруппировать пары атрибут-час и их соответствующие вхождения.
Затем вы проецируете атрибут, пару часов и копию этого счета.
Наконец, вы группируете по одному атрибуту, $push
пары, и суммировать счет.
[
{
$group: {
_id: {
attribute: "$attribute",
hour: { "$hour": "$date" }
},
count: {
$sum: 1
}
}
},
{
$project: {
attribute: "$_id.attribute",
pair: { hour: "$_id.hour", count: "$count" },
count: "$count",
_id: 0
}
},
{
$group: {
_id: "$attribute",
hours: {
$push: "$pair"
},
total: {
$sum: "$count"
}
}
}
]