Вложенная группа MongoDB?
Я пытаюсь реализовать вложенный групповой запрос в mongodb, и я застреваю, пытаясь добавить внешнюю группу. Учитывая нижеследующий (упрощенный) документ данных:
{
"timestamp" : ISODate(),
"category" : "movies",
"term" : "my movie"
}
Я пытаюсь получить список всех категорий, и в пределах категорий должно быть максимальное количество терминов. Я бы хотел, чтобы мой вывод был примерно таким:
[
{ category: "movies",
terms: [ { term: "movie 1", total: 5000 }, { term: "movie 2", total: 200 } ... ]
},
{ category: "sports",
terms: [ { term: "football 1", total: 4000 }, { term: "tennis 2", total: 250 } ... ]
},
]
Моя "внутренняя группа" показана ниже и получит 5 лучших для категорий all:
db.collection.aggregate([
{ $match : { "timestamp": { $gt: ISODate("2014-08-27") } } },
{ $group : { _id : "$term", total : { $sum : 1 } } },
{ $sort : { total : -1 } },
{ $limit: 5 }
]);
// Outputs:
{ "_id" : "movie 1", "total" : 943 }
{ "_id" : "movie 2", "total" : 752 }
Как я могу реализовать "внешнюю группу"?
Кроме того, указанный выше суммарный ион возвращает нулевое значение (не все документы имеют значение термина). Как я могу проигнорировать нулевые значения?
заблаговременно
Ответы
Ответ 1
В этом случае вам понадобятся две группы. Первая группа генерирует поток документов с одним документом за период и категорию:
{ $group : {
_id : {
category: "$category",
term: "$term",
},
total: { $sum : 1 }
}
}
Вторая группа объединяет все документы с одним и тем же термином в один, используя оператор $push для объединения категорий в массив:
{ $group : {
_id : "$_id.category",
terms: {
$push: {
term:"$_id.term",
total:"$total"
}
}
}
}
Ответ 2
Запрос:
db.getCollection('organica_sidu').aggregate([
{$match:{
tipo: {$regex:"[A-Z]+"}
}
},
{$group:
{
_id:{
codigo:"1",
tipo:"$tipo",
},
total:{$sum:1}
}
},
{$group:
{
_id:"$_id.codigo",
tipos:
{
$push:
{
tipo:"$_id.tipo",
total:"$total"
}
},
totalGeneral:{$sum:"$total"}
}
}
]);