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

2 måder at begrænse de dokumenter, der returneres i MongoDB

Når du kører forespørgsler i MongoDB, har du mulighed for at begrænse antallet af returnerede dokumenter. Det er her, du angiver et maksimalt antal dokumenter, der skal returneres af operationen.

For eksempel, hvis en operation normalt ville returnere 2.000 dokumenter, men du angiver en grænse på 1.000, returneres kun 1.000 dokumenter. Men hvis operationen kun ville returnere f.eks. 500 dokumenter, så returneres alle 500 (fordi de ikke overtræder grænsen på 1.000 dokumenter).

Det er lidt ligesom at bruge TOP klausul i SQL Server eller LIMIT klausul i MySQL, MariaDB, PostgreSQL og SQLite.

Begrænsning af de returnerede dokumenter kan hjælpe med at forbedre ydeevnen ved at forhindre, at flere dokumenter returneres og behandles, end det er nødvendigt.

I MongoDB kan vi bruge cursor.limit() metoden eller $limit aggregeringsoperatør for at begrænse de dokumenter, der returneres.

cursor.limit() Metode

Antag, at vi har en samling kaldet pets med følgende dokumenter:

{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 }
{ "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 }
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
{ "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 }
{ "_id" : 5, "name" : "Bruce", "type" : "Bat", "weight" : 3 }
{ "_id" : 6, "name" : "Fetch", "type" : "Dog", "weight" : 17 }
{ "_id" : 7, "name" : "Jake", "type" : "Dog", "weight" : 30 }

Vi kan bruge limit() metode til at begrænse antallet af dokumenter, der returneres, når der forespørges på denne samling.

Eksempel:

db.pets.find().limit(3)

Resultat:

{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 }
{ "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 }
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }

$limit Aggregationsoperatør

Når du bruger aggregeringspipelinen, kan du bruge $limit aggregeringsoperatør for at begrænse de resultater, der sendes til næste fase i pipelinen.

Eksempel:

db.pets.aggregate([
    {
      $match: { }
    },
     { 
      $limit : 3
    }
])

Eksempel:

{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 }
{ "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 }
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }

Typisk er $match operatør ville ikke bestå af et tomt dokument, som vi har her. Det vil normalt indeholde en forespørgsel, som resultaterne kan filtreres med på den del af pipelinen. Men i dette tilfælde brugte jeg et tomt dokument for at gøre eksemplet lettere at følge.

Da jeg bestod et tomt dokument i den første fase, kunne jeg bare have gjort dette:

db.pets.aggregate([
     { 
      $limit : 3
    }
])

Uanset hvad var resultatet begrænset til kun 3 dokumenter.

Når det bruges i aggregeringspipelinen, er $limit operatøren kunne være et sted i midten af ​​rørledningen. Hvis det er tilfældet, sender den de begrænsede dokumenter til næste trin.

Her er et eksempel for at illustrere, hvad jeg mener.

db.pets.aggregate([
    {
      $match: { }
    },
     { 
      $limit : 3
    },
    {
      $match: { "type": "Cat" }
    }
])

Resultat:

{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }

Kun én kat var i de begrænsede resultater (selvom der er to katte i det originale dokument), så kun den kat blev matchet i tredje fase.

Dette er anderledes end at gøre følgende.

db.pets.aggregate([
    {
      $match: { "type": "Cat" }
    },
     { 
      $limit : 3
    }
])

Resultat:

{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
{ "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 }

I dette tilfælde søgte vi efter katte i det originale dokument og begrænsede derefter resultaterne til kun 3. Da der kun er 2 katte, er $limit havde ingen indflydelse på resultatet.

Begrænsning af sorterede dokumenter

Hvis du begrænser resultaterne efter sortering af dokumenterne, vil grænsen tage hensyn til sorteringen.

Eksempel:

db.pets.aggregate([
    {
      $sort: { "_id": -1 }
    },
     { 
      $limit : 3
    }
])

Resultat:

{ "_id" : 7, "name" : "Jake", "type" : "Dog", "weight" : 30 }
{ "_id" : 6, "name" : "Fetch", "type" : "Dog", "weight" : 17 }
{ "_id" : 5, "name" : "Bruce", "type" : "Bat", "weight" : 3 }

I dette tilfælde sorterede jeg alle dokumenter efter deres _id felt i faldende rækkefølge (-1 angiver faldende rækkefølge).

Her er det igen i stigende rækkefølge (en værdi på 1 angiver stigende rækkefølge):

db.pets.aggregate([
    {
      $sort: { "_id": 1 }
    },
     { 
      $limit : 3
    }
])

Resultat:

{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 }
{ "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 }
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }

Når du begrænser resultater, efter at de eksplicit er blevet sorteret, skal du sikre dig, at sorteringsoperationen brugte en stabil sortering.

En stabil sortering er en, der returnerer den samme sorteringsrækkefølge, hver gang den udføres. En ustabil sortering på den anden side er en, der kan returnere en anden sorteringsrækkefølge, når den udføres flere gange.

For at sikre, at du udfører en stabil sortering, skal du inkludere mindst ét ​​felt i din sortering, der udelukkende indeholder unikke værdier (f.eks. _id felt).

Flere oplysninger

For mere information, se MongoDB-dokumentationen for:

  • cursor.limit()
  • $limit (sammenlægning)

  1. Opret et wildcard-indeks i MongoDB

  2. Rails brugerdefineret miljø Resque.enqueue skaber ikke job

  3. $push og $set i samme MongoDB-opdatering

  4. Sådan isoleres spring boot app redis og spring boot session global redis