MongoDB: limit, skip, sort — эффективный поиск

Рассмотрим методы limit, skip и sort в MongoDB и их комбинирование.

Порядок выполнения методов

Подключимся к коллекции grocer (вместо getCollection(‘course’)). Объединим методы: limit (ограничение до 10 документов), skip (пропуск 15 документов) и sort (сортировка по индексу в убывающем порядке):

db.grocer.find().limit(10).skip(15).sort({index: -1})

Каждый метод возвращает курсор. Все операции выполняются на сервере до возврата курсора клиенту.

В каком порядке выполняются операции?

Выполнив запрос, получим документы, начиная с индекса 85 и далее в убывающем порядке (84, 83 и т.д.) до индекса 76 (всего 10 документов). Элементы с индексами от 86 до 100 пропущены. Это означает, что сначала выполняется sort, затем skip, и наконец, limit.

Изменим порядок методов:

db.grocer.find().limit(10).skip(15).sort({index: -1}) // Исходный порядок
db.grocer.find().skip(15).limit(10).sort({index: -1}) // limit перед skip
db.grocer.find().sort({index: -1}).skip(15).limit(10) // sort перед skip

Результат остается тем же. Независимо от порядка, приоритет на сервере всегда один и тот же: sort, skip, limit.

Влияние на метод count

Добавим метод count() в конец цепочки:

db.grocer.find().sort({index: -1}).skip(15).limit(10).count()

Результат: 100. sort, skip и limit не влияют на count(). count() возвращает количество документов, соответствующих условиям find(), независимо от других методов.

Методы sort, skip и limit в MongoDB выполняются на сервере в порядке: sort, skip, limit. count() не зависит от них и всегда возвращает общее количество документов, соответствующих условиям find().

Что будем искать? Например,программа