Как добавить лимит при выполнении этапа $ match в конвейере агрегации - PullRequest
0 голосов
/ 23 января 2019

При выполнении запроса find () я могу передавать такие параметры, как limit и sort. Я предполагаю, что это означает, что база данных перестанет пытаться фильтровать соответствующие документы после того, как будет найдено предельное количество документов.

При попытке выполнить то же самое с помощью конвейера агрегации я помещаю тот же запрос из find (), что и этап $ match, но не могу указать ограничение.

Проблема с $ limit заключается в том, что это происходит только на следующем этапе, поэтому mongo обработает каждый отдельный документ в коллекции, прежде чем перейти к следующему этапу, что может стать очень медленным по мере увеличения размера коллекции.

1 Ответ

0 голосов
/ 23 января 2019

Структура агрегации действует как поток, поэтому, если в вашем конвейере есть этап $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 завершит свой процесс, прежде чем она сможет ограничить вывод.

Проверьте Объясните результаты и Агрегационный конвейер Оптимизация для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...