Вложенная группа 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"}

        }

    }


]);