Предполагая, что у меня есть коллекция под названием "posts" (на самом деле это более сложная коллекция, сообщения слишком просты) со следующей структурой:
> db.posts.find()
{ "id" : ObjectId("50ad8d451d41c8fc58000003"), "title" : "Lorem ipsum", "author" :
"John Doe", "content" : "This is the content", "tags" : [ "SOME", "RANDOM", "TAGS" ] }
Я ожидаю, что эта коллекция будет охватывать сотни тысяч, а может быть миллионы, что мне нужно запросить сообщения по тегам и сгруппировать результаты по тегу и отобразить результаты с разбивкой по страницам. Именно здесь возникает структура агрегации. Я планирую использовать метод aggregate() для запроса коллекции:
db.posts.aggregate(
{ "unwind" : "$tags" },
{ "group" : {
_id: { tag: "$tags" },
count: { $sum: 1 }
} }
);
Ловушка заключается в том, что для создания paginator мне понадобится знать длину выходного массива. Я знаю, что вы можете сделать это:
db.posts.aggregate(
{ "unwind" : "$tags" },
{ "group" : {
_id: { tag: "$tags" },
count: { $sum: 1 }
} }
{ "group" : {
_id: null,
total: { $sum: 1 }
} }
);
Но это отбрасывает вывод из предыдущего конвейера (первая группа). Есть ли способ объединить две операции при сохранении каждого выходного конвейера? Я знаю, что вывод всей операции агрегата может быть передан в массив на каком-то языке и подсчитывается содержимое, но может быть вероятность того, что выход конвейера может превысить предел 16 Мб. Кроме того, выполнение одного и того же запроса только для получения счета кажется ненужным.
Итак, получается результат документа и рассчитывается одновременно? Любая помощь приветствуется.