sql >> Database >  >> NoSQL >> MongoDB

Bereikquery voor MongoDB-paginering

Het is prima om ObjectId() te gebruiken, hoewel uw syntaxis voor paginering verkeerd is. Je wilt:

 db.tweets.find().limit(50).sort({"_id":-1});

Dit zegt dat je tweets wilt sorteren op _id waarde in aflopende volgorde en u wilt de meest recente 50. Uw probleem is het feit dat paginering lastig is wanneer de huidige resultatenset verandert - dus in plaats van overslaan te gebruiken voor de volgende pagina, wilt u de kleinste _id in de resultatenset (de 50e meest recente _id waarde en ga dan naar de volgende pagina met:

 db.tweets.find( {_id : { "$lt" : <50th _id> } } ).limit(50).sort({"_id":-1});

Dit geeft je de volgende "meest recente" tweets, zonder dat nieuwe inkomende tweets je paginering in de tijd verpesten.

U hoeft zich absoluut geen zorgen te maken of _id waarde komt strikt overeen met de invoegvolgorde - het zal 99,999% dicht genoeg zijn, en het kan niemand iets schelen welke tweet eerst kwam - je zou zelfs kunnen merken dat Twitter regelmatig tweets in de verkeerde volgorde weergeeft, het is gewoon niet zo kritisch.

Als het is kritiek, dan zou je dezelfde techniek moeten gebruiken, maar met "tweetdatum" waarbij die datum een ​​tijdstempel zou moeten zijn, in plaats van alleen een datum.



  1. E-mailindexering met Cloudera Search en HBase

  2. MongoDB Connection Pooling gebruiken op AWS Lambda

  3. krijg mongodb _id object na upsert met php

  4. Aan de slag met MongoDB en Mongoose