Преглеждането на вашите данни е една от най-често срещаните операции с MongoDB. Типичен сценарий е необходимостта да показвате резултатите си на парчета във вашия потребителски интерфейс. Ако обработвате данните си пакетно, важно е също да направите правилната стратегия за пейджинг, за да може обработката на данни да се мащабира.
Нека преминем през пример, за да видим различните начини за прелистване на данни в MongoDB. В този пример имаме CRM база данни с потребителски данни, които трябва да прегледаме и да покажем 10 потребители наведнъж. Така че на практика размерът на нашата страница е 10. Ето структурата на нашия потребителски документ:
{ _id, name, company, state }
Подход 1:Използване на skip() и limit()
MongoDB по естествен начин поддържа операцията за пейджинг с помощта на командите skip() и limit(). Директивата skip(n) казва на MongoDB, че трябва да пропусне „n“ резултати, а директивата limit(n) инструктира MongoDB, че трябва да ограничи дължината на резултата до „n“ резултати. Обикновено ще използвате директивите skip() и limit() с курсора си - но за да илюстрираме сценария, ние предоставяме конзолни команди, които биха постигнали същите резултати. Освен това, за краткост на кода, кодът за проверка на ограниченията също е изключен:
//Page 1 db.users.find().limit (10) //Page 2 db.users.find().skip(10).limit(10) //Page 3 db.users.find().skip(20).limit(10) ........
Разбирате идеята. Като цяло, за да извлечете страница „n“, кодът изглежда така:
db.users.find().skip(pagesize*(n-1)).limit(pagesize)
Въпреки това, тъй като размерът на вашите данни се увеличава, този подход има сериозни проблеми с производителността. Причината е, че всеки път, когато се изпълни заявката, се изгражда пълният набор от резултати, след което сървърът трябва да премине от началото на колекцията до определеното отместване. С увеличаването на вашето изместване този процес става все по-бавен. Освен това този процес не използва ефективно индексите. Така че обикновено подходът „skip()“ и „limit()“ е полезен, когато имате малки набори от данни и ако работите с големи набори от данни, ще искате да обмислите други подходи.
Подход 2:Използване на find() и limit()
Причината, поради която предишният подход не се мащабира много добре, е командата skip() и целта в този раздел е да се приложи пейджинг без използване на командата „skip()“. За това ще използваме естествения ред в съхранените данни, като времева марка или идентификатор, съхранен в документа. В този пример ще използваме „_id“, съхранен във всеки документ. „_id“ е структура на MongoDB ObjectID, която е 12-байтова структура, съдържаща времеви печат, обработен, processid, брояч и т.н. Общата идея е следната:
1. Извличане на _id на последния документ в текущата страница
2. Извлечете документи, по-големи от този „_id“ на следващата страница
//Page 1 db.users.find().limit(pageSize); //Find the id of the last document in this page last_id = ... //Page 2 users = db.users.find({'_id'> last_id}). limit(10); //Update the last id with the id of the last document in this page last_id = ...
Този подход използва присъщия ред, който съществува в полето „_id“. Освен това, тъй като полето „_id“ е индексирано по подразбиране, производителността на операцията за намиране е много добра. Ако полето, което използвате, не е индексирано, ефективността ви ще пострада – затова е важно да се уверите, че полето е индексирано.
Освен това, ако искате вашите данни да бъдат сортирани в определен ред за вашия пейджинг, тогава можете също да използвате клаузата sort() с горната техника. Важно е да се гарантира, че процесът на сортиране използва индекс за най-добра производителност. Можете да използвате суфикса .explain() към вашата заявка, за да определите това:
users = db.users.find({'_id'> last_id}). sort(..).limit(10); //Update the last id with the id of the last document in this page last_id = ...
Както винаги, ако имате въпроси или коментари, не се колебайте да се свържете с нас на [email protected].