sql >> Database >  >> NoSQL >> MongoDB

Snelle paging met MongoDB

Door uw gegevens bladeren is een van de meest voorkomende bewerkingen met MongoDB. Een typisch scenario is de noodzaak om uw resultaten in brokken in uw gebruikersinterface weer te geven. Als u uw gegevens batchgewijs verwerkt, is het ook belangrijk om uw pagingstrategie correct te hebben, zodat uw gegevensverwerking kan schalen.

Laten we een voorbeeld doornemen om de verschillende manieren te zien om door gegevens in MongoDB te bladeren. In dit voorbeeld hebben we een CRM-database met gebruikersgegevens die we nodig hebben om door te bladeren en 10 gebruikers tegelijk weer te geven. Dus in feite is onze paginagrootte 10. Hier is de structuur van ons gebruikersdocument:

{
    _id,
    name,
    company,
    state
}

Benadering 1:Skip() en limit() gebruiken

MongoDB ondersteunt native de paging-bewerking met behulp van de opdrachten skip() en limit(). De skip (n) -richtlijn vertelt MongoDB dat het 'n' resultaten moet overslaan, en de limit (n) -richtlijn instrueert MongoDB dat het de resultaatlengte moet beperken tot 'n' resultaten. Meestal gebruikt u de instructies skip() en limit() met uw cursor, maar om het scenario te illustreren, bieden we consoleopdrachten die dezelfde resultaten zouden opleveren. Om de code kort te houden, is de code voor het controleren van de limieten ook uitgesloten:

//Page 1
db.users.find().limit (10)
//Page 2
db.users.find().skip(10).limit(10)
//Page 3
db.users.find().skip(20).limit(10)
........

Je snapt het idee. Over het algemeen ziet de code er als volgt uit om pagina 'n' op te halen:

db.users.find().skip(pagesize*(n-1)).limit(pagesize)

Naarmate de omvang van uw gegevens toeneemt, levert deze aanpak echter ernstige prestatieproblemen op. De reden is dat elke keer dat de query wordt uitgevoerd, de volledige resultatenset wordt opgebouwd, waarna de server van het begin van de verzameling naar de opgegeven offset moet lopen. Naarmate uw offset toeneemt, wordt dit proces langzamer en langzamer. Ook maakt dit proces geen efficiënt gebruik van de indexen. De benaderingen 'skip()' en 'limit()' zijn dus meestal handig als u kleine datasets hebt, en als u met grote datasets werkt, wilt u andere benaderingen overwegen.

Benadering 2:Find() en limit() gebruiken

De reden waarom de vorige benadering niet erg goed schaalt, is de opdracht skip() en het doel in deze sectie is om paginering te implementeren zonder de opdracht 'skip()' te gebruiken. Hiervoor gaan we gebruikmaken van de natuurlijke volgorde in de opgeslagen gegevens, zoals een tijdstempel of een id die in het document is opgeslagen. In dit voorbeeld gaan we de '_id' gebruiken die in elk document is opgeslagen. '_id' is een MongoDB ObjectID-structuur die een 12-byte-structuur is met een tijdstempel, machinaal bewerkt, proces-id, teller, enz. Het algemene idee is als volgt:

1. Haal de _id op van het laatste document op de huidige pagina
2. Haal documenten op die groter zijn dan deze "_id" op de volgende pagina

//Page 1
db.users.find().limit(pageSize);
//Find the id of the last document in this page
last_id = ...

//Page 2
users = db.users.find({'_id'> last_id}). limit(10);
//Update the last id with the id of the last document in this page
last_id = ...

Deze benadering maakt gebruik van de inherente volgorde die bestaat in het veld "_id". Omdat het veld "_id" standaard is geïndexeerd, zijn de prestaties van de zoekbewerking ook erg goed. Als het veld dat je gebruikt niet is geïndexeerd, zullen je prestaties eronder lijden. Het is dus belangrijk om ervoor te zorgen dat dat veld is geïndexeerd.

Als u bovendien wilt dat uw gegevens in een bepaalde volgorde voor uw paging worden gesorteerd, kunt u met de bovenstaande techniek ook de clausule sort() gebruiken. Het is belangrijk om ervoor te zorgen dat het sorteerproces gebruikmaakt van een index voor de beste prestaties. U kunt het achtervoegsel .explain() voor uw zoekopdracht gebruiken om dit te bepalen:

users = db.users.find({'_id'> last_id}). sort(..).limit(10);
//Update the last id with the id of the last document in this page
last_id = ...

Zoals altijd, als je vragen of opmerkingen hebt, neem dan gerust contact met ons op via [email protected].


  1. Mongoose retourneert ongedefinieerd voor een bestaand veld

  2. Meteor:verschil tussen namen voor collecties, variabelen, publicaties en abonnementen?

  3. MongoDB Node controleren of object-id geldig is

  4. Met back-upcodering voor MySQL, MongoDB en PostgreSQL - ClusterControl 1.5.1