sql >> Database teknologi >  >> NoSQL >> MongoDB

Hurtig personsøgning med MongoDB

Bladring gennem dine data er en af ​​de mest almindelige operationer med MongoDB. Et typisk scenarie er behovet for at vise dine resultater i bidder i din brugergrænseflade. Hvis du batchbehandler dine data, er det også vigtigt at få din personsøgningsstrategi korrekt, så din databehandling kan skaleres.

Lad os gennemgå et eksempel for at se de forskellige måder at bladre gennem data i MongoDB. I dette eksempel har vi en CRM-database med brugerdata, som vi skal bladre igennem og vise 10 brugere ad gangen. Så i realiteten er vores sidestørrelse 10. Her er strukturen i vores brugerdokument:

{
    _id,
    name,
    company,
    state
}

Fremgangsmåde 1:Brug af skip() og limit()

MongoDB understøtter indbygget personsøgning ved hjælp af kommandoerne skip() og limit(). Skip(n)-direktivet fortæller MongoDB, at det skal springe 'n'-resultater over, og limit(n)-direktivet instruerer MongoDB om, at det skal begrænse resultatlængden til 'n' resultater. Typisk vil du bruge skip()- og limit()-direktiverne med din markør  - men for at illustrere scenariet giver vi konsolkommandoer, der ville opnå de samme resultater. Af hensyn til kodens korthed er grænsekontrolkoden også udelukket:

//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)
........

Du forstår ideen. Generelt, for at hente side 'n' ser koden sådan ud:

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

Men efterhånden som størrelsen af ​​dine data stiger, har denne tilgang alvorlige ydeevneproblemer. Årsagen er, at hver gang forespørgslen udføres, bygges det fulde resultatsæt op, så skal serveren gå fra begyndelsen af ​​samlingen til den angivne offset. Efterhånden som din offset stiger, bliver denne proces langsommere og langsommere. Denne proces gør heller ikke effektiv brug af indekserne. Så typisk er "skip()" og "limit()"-tilgangen nyttig, når du har små datasæt, og hvis du arbejder med store datasæt, vil du overveje andre tilgange.

Fremgangsmåde 2:Brug af find() og limit()

Grunden til, at den tidligere tilgang ikke skaleres særlig godt, er kommandoen skip() og målet i dette afsnit er at implementere sidesøgning uden at bruge kommandoen 'skip()'. Til dette vil vi udnytte den naturlige rækkefølge i de lagrede data som et tidsstempel eller et id, der er gemt i dokumentet. I dette eksempel skal vi bruge '_id'et, der er gemt i hvert dokument. '_id' er en MongoDB ObjectID-struktur, som er en 12-byte struktur, der indeholder et tidsstempel, bearbejdet, processid, tæller osv. Den overordnede idé er som følger:

1. Hent _id'et for det sidste dokument på den aktuelle side
2. Hent dokumenter, der er større end dette "_id" på næste side

//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 = ...

Denne tilgang udnytter den iboende rækkefølge, der findes i feltet "_id". Da "_id"-feltet er indekseret som standard, er ydeevnen af ​​find-operationen også meget god. Hvis det felt, du bruger, ikke er indekseret, vil din ydeevne lide – så det er vigtigt at sikre, at feltet er indekseret.

Derudover, hvis du gerne vil have dine data sorteret i en bestemt rækkefølge for din personsøgning, så kan du også bruge sort()-klausulen med ovenstående teknik. Det er vigtigt at sikre, at sorteringsprocessen udnytter et indeks for den bedste ydeevne. Du kan bruge suffikset .explain() til din forespørgsel for at bestemme dette:

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 = ...

Som altid, hvis du har spørgsmål eller kommentarer, er du velkommen til at kontakte os på [email protected].


  1. Redis INCR samtidighed

  2. En simpel tagging-implementering med MongoDB

  3. Sådan opdaterer du eksisterende dokumenter i MongoDB

  4. Kontrollerer forbindelsen til MongoDB