sql >> Databasteknik >  >> NoSQL >> MongoDB

Lata laddar/mer data Bläddra i Mongoose/Nodejs

Det allmänna konceptet med "paging" är att använda .skip() som i princip "hoppar" över resultaten som redan har hämtats, så du kan i princip göra detta:

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

Men egentligen, som du kan föreställa dig kommer detta att sakta ner avsevärt när du får in några "sidor". Så du vill verkligen ha något smartare. Detta är i huvudsak en "intervallfråga" där du vill få högre (eller lägre om fallande ) resultat än den senast hämtade uppsättningen resultat. Så givet det sista värdet på 5 sedan för mer än du skulle göra:

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

Ser ut okej, men det finns fortfarande ett problem. Tänk om nästa "sida" också innehöll resultat med betyget 5? Den här frågan skulle hoppa över dessa och aldrig visa dem.

Det smarta att göra är att "behålla" hela _id värden från dokumentet eftersom de är unika nycklar. Använd i princip samma sak, förutom att den här gången se till att du inte inkluderar resultaten från föregående sida i din nya. $nin operatören hjälper här:

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

Om seenIds är bara den sista sidan med resultat eller något mer beror på "densiteten" för värdet du sorterar på, och naturligtvis måste du "behålla" dessa i en sessionsvariabel eller något.

Men försök att anpassa detta, eftersom intervallfrågor vanligtvis är ditt bästa resultat.




  1. Mongoose:populate() / DBref eller dataduplicering?

  2. MongoDB en till många relation

  3. Uppdatering av ett specifikt element i en array med MongoDB / Meteor

  4. Stackexchange.redis saknar WAIT-stödet