Структура агрегации действует как поток, поэтому, если в вашем конвейере есть этап $limit
, он остановит обработку, как только будет достигнут предел.
Например:
> db.test.find()
{ "_id": 0 }
{ "_id": 1 }
{ "_id": 2 }
{ "_id": 3 }
{ "_id": 4 }
Допустим, я хочу использовать этап $match
, за которым следует этап $limit
. Использование explain()
в агрегации:
> db.test.explain('executionStats').aggregate([
{$match: {_id: {$lte: 3}}},
{$limit: 1}
])
...
"executionStats": {
"executionSuccess": true,
"nReturned": 1,
"executionTimeMillis": 0,
"totalKeysExamined": 1,
"totalDocsExamined": 1,
...
Вывод объяснения показывает, что MongoDB исследовал только 1 ключ (totalKeysExamined: 1
) и 1 документ (totalDocsExamined: 1
), чтобы вернуть 1 документ (nReturned: 1
) из-за стадии $limit
. Это несмотря на то, что я указываю, что он соответствует _id <= 3
, что должно выбрать 4 документа.
Обратите внимание, что большинство этапов работают так, за исключением таких этапов, как $group
, которые должны собрать все необходимые документы, прежде чем они смогут выполнить группировку по ним. Установка $limit
после $group
не заставит стадию $limit
выступать в качестве потока, поскольку она должна ждать, пока стадия $group
завершит свой процесс, прежде чем она сможет ограничить вывод.
Проверьте Объясните результаты и Агрегационный конвейер Оптимизация для получения дополнительной информации.