MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Lazy loading/więcej przewijania danych w Mongoose/Nodejs

Ogólna koncepcja „stronicowania” polega na użyciu .skip() który zasadniczo „przeskakuje” wyniki, które zostały już pobrane, więc możesz to zrobić:

var q = Post.find().sort( "rating" ).skip(10).limit(10);

Ale tak naprawdę, jak możesz sobie wyobrazić, to znacznie zwolni, gdy pojawi się kilka „stron”. Więc naprawdę chcesz czegoś mądrzejszego. Zasadniczo jest to „zapytanie zakresowe”, w którym chcesz uzyskać wyższe (lub niższe, jeśli malejące ) wyniki niż ostatni pobrany zestaw wyników. Więc biorąc pod uwagę ostatnią wartość 5 wtedy za większe niż byś zrobił:

var q = Post.find({ "rating": { "$gt": 5 } }).sort( "rating" ).limit(10);

Wygląda dobrze, ale tak naprawdę nadal jest problem. Co zrobić, jeśli następna „strona” również zawierała wyniki z oceną 5? To zapytanie pominie je i nigdy ich nie wyświetli.

Mądrą rzeczą do zrobienia jest "zachowanie" wszystkich _id wartości z dokumentu, ponieważ są to unikalne klucze. Zasadniczo zastosuj to samo, ale tym razem upewnij się, że nie uwzględniasz wyników z poprzedniej strony w nowej. $nin operator pomaga tutaj:

var q = Post.find({ "rating": { "$gte": 5 }, "_id": { "$nin": seenIds } })
    .sort( "rating" ).limit(10);

Czy seenIds to tylko ostatnia strona wyników lub więcej zależy od „gęstości” wartości, według której sortujesz, i oczywiście musisz „zachować” je w zmiennej sesji lub coś takiego.

Ale spróbuj to dostosować, ponieważ zapytania o zakres są zwykle najlepszym wynikiem.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. $unionWith — odpowiednik UNION ALL w MongoDB

  2. Użyj wyniku z poprzedniego zapytania w innym zapytaniu w mongodb

  3. Mongo $addToUstaw tablicę

  4. MongoDB findAndModify. Czy to naprawdę atomowe? Pomóż napisać zamknięte rozwiązanie aktualizacji

  5. Przeszukuj wyszukiwanie MongoDB tylko w określonych godzinach