Рассмотрим методы 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().