MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Бързо пейджиране с MongoDB

Преглеждането на вашите данни е една от най-често срещаните операции с 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].


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Свързване на MongoDB от мобилно или базирано на браузър приложение

  2. Как да инсталирате MongoDB 4.2 на системи RedHat/ CentOS 7

  3. Percona Live Frankfurt 2018 – Резюме на събитието и нашите сесии

  4. MongoDB - вземете документи с максимум атрибут за група в колекция

  5. Избягвайте предупреждението за оттегляне на текущия анализатор на URL низове, като зададете useNewUrlParser на true