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

Вземете индекс на елемент в рамките на заявка за mongodb

Подреждане по subjectID

Ако вашият subjectID е (или може да бъде променено на) монотонно нарастваща стойност (например MongoDB ObjectID по подразбиране), имате ясна опция, като използвате нормален find() с подходящо сортиране, пропускане и ограничение. В този случай можете да търсите документи с идентификатори на обект $gte (по-голямо или равно на) вашият subjectID :

var page = 1;
var subjectID = ObjectId("515535a0760fe8735f5f6897");
db.users.find(
    { _id: { $gte : subjectID } }
).sort({'_id':1}).skip(page*20).limit(20)

Рамка за агрегиране

Както при MongoDb 2.4, няма такава функция в Aggregation Framework, която да съответства въз основа на позицията на документа в конвейера на резултатите. Можете да подадете предложение за нова функция в SERVER на проекта MongoDB Jira опашка.

Изглежда, че бихте искали нов оператор на тръбопровод като $matchfrom което би игнорирало всички документи до първото срещане на $matchfrom критерии. След това можете да добавите $limit за да вземете следващите n елемента. Също така бихте искали да имате сортиран изход преди $matchfrom така че има предвидим резултат.

Това изглежда прекалено сложно в сравнение с наличието на нарастващ subjectID, но може да има случай на използване за извършване на страниране въз основа на по-усъвършенствани критерии за търсене или резултати, изчислени в конвейера за агрегиране.

Алтернативни подходи

Освен бъдещата поддръжка за такава функция в Aggregation Framework, имате няколко опции за прилагане на същия подход за съвпадение в кода:

  • използвайте по-стария group() команда за агрегиране с finalize() функция. ЗАБЕЛЕЖКА:group() правине работа с разделени клъстери.

  • използвайте MapReduce и finalize() функция

  • извлечете целия набор от резултати от рамката за агрегиране и внедрите съпоставянето/намаляването на резултатите в кода на вашето приложение (въпреки че това донякъде обезсмисля идеята за "странициране", ако извличате всички страници за всяка заявка).

Съображения за производителност

Заявки с skip все още трябва да прочетете междинните записи на индекса, така че пропускането на голям брой документи няма да бъде много ефективно.

Вместо страниране с отместване за пропускане, можете да помислите за извършване на последователни заявки за страници, като започнете от последния запис на предишната страница (т.е. първата страница ще бъде $gte началният субектID и следващите страници ще бъдат $gt последният субектID, включен на предишната страница). Това ще зависи от начина, по който представяте странирането във вашия потребителски интерфейс - би било най-лесно да използвате този подход, ако потребителският ви интерфейс има само опцията да показва „следващата“ страница със съобщения, вместо да прескача към конкретна страница.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Нуждаете се от различен брой на множество полета, които са били обединени от друга колекция с помощта на заявка за агрегиране на mongodb

  2. Mongoose findByIdAndUpdate не връща правилния модел

  3. Максимален брой бази данни, поддържани от MongoDB

  4. Как да премахнете свойството на вложен обект от MongoDB документ?

  5. Mongoose актуализира дълбоки масиви