Говоря о нумерации страниц в MongoDB, легко написать этот код:
collection.find().skip(pageSize*(pageNum-1)).limit(pageSize);
Выше приведено нативное решение, поддерживаемое MongoDB, но оно неэффективно, если в коллекции есть огромные документы. Предположим, у вас есть 100 миллионов документов, и вы хотите получить данные из среднего смещения (50 миллионов). MongoDB должен создать полный набор данных и перейти от начала к указанному смещению , это будет низкая производительность. По мере увеличения вашего смещения производительность продолжает падать.
Основной причиной является команда skip()
, которая неэффективна и не может получить большой выигрыш от индекса.
Ниже приведено еще одно решение для повышения производительности при разбивке на большие данные:
Типичный сценарий использования разбивки на страницы состоит в том, что существует таблица или список для отображения данных указанной страницы, а также кнопка «Предыдущая страница» *1017* & «Следующая страница» для загрузить данные предыдущей или следующей страницы.
Если вы получили '_id'
последнего документа на текущей странице, вы можете использовать find()
вместо skip()
. Используйте _id> currentPage_LastDocument._id в качестве одного из критериев для поиска данных следующей страницы. Вот псевдокод:
//Page 1
collection.find().limit(pageSize);
//Get the _id of the last document in this page
last_id = ...
//Page 2
users = collection.find({'_id': {$gt: last_id}}).limit(pageSize);
//Update the last id with the _id of the last document in this page
last_id = ...
Это позволит избежать обхода больших данных MongoDB при использовании skip()
.