sql >> Databasteknik >  >> NoSQL >> MongoDB

Områdesfråga för MongoDB-paginering

Det går alldeles utmärkt att använda ObjectId() även om din syntax för sidnumrering är fel. Du vill:

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

Detta säger att du vill ha tweets sorterade efter _id värde i fallande ordning och du vill ha den senaste 50. Ditt problem är det faktum att sidnumrering är knepigt när den aktuella resultatuppsättningen ändras - så istället för att använda hoppa över för nästa sida, vill du anteckna den minsta _id i resultatuppsättningen (den 50:e senaste _id värde och få nästa sida med:

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

Detta kommer att ge dig nästa "senaste" tweets, utan att nya inkommande tweets förstör din paginering bakåt i tiden.

Det finns absolut ingen anledning att oroa sig för om _id värdet motsvarar strikt insättningsordningen - det kommer att vara 99,999% tillräckligt nära, och ingen bryr sig faktiskt på den sekundära nivån vilken tweet som kom först - du kanske till och med märker att Twitter ofta visar tweets i oordning, det är bara inte så kritiskt.

Om det är kritiskt, då måste du använda samma teknik men med "tweet-datum" där det datumet måste vara en tidsstämpel, snarare än bara ett datum.



  1. Timeout-undantag efter async-kommandon och Task.WhenAny väntar i StackExchange.Redis

  2. Uppdatering av ett stort antal poster i en samling

  3. redis-py :Vad är skillnaden mellan StrictRedis() och Redis()?

  4. 3 sätt att returnera ett slumpmässigt urval av dokument från en MongoDB-samling