sql >> Databasteknik >  >> NoSQL >> MongoDB

2 sätt att begränsa dokumenten som returneras i MongoDB

När du kör frågor i MongoDB har du möjlighet att begränsa antalet dokument som returneras. Det är här du anger ett maximalt antal dokument som ska returneras av operationen.

Till exempel, om en operation normalt skulle returnera 2 000 dokument, men du anger en gräns på 1 000, returneras endast 1 000 dokument. Men om operationen bara skulle returnera till exempel 500 dokument, så returneras alla 500 (eftersom de inte bryter mot gränsen på 1 000 dokument).

Det här är lite som att använda TOP sats i SQL Server, eller LIMIT sats i MySQL, MariaDB, PostgreSQL och SQLite.

Att begränsa antalet returnerade dokument kan bidra till att förbättra prestandan genom att förhindra att fler dokument returneras och bearbetas än vad som är nödvändigt.

I MongoDB kan vi använda cursor.limit() metoden eller $limit aggregeringsoperatör för att begränsa de dokument som returneras.

cursor.limit() Metod

Anta att vi har en samling som heter pets med följande dokument:

{ "_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 använda limit() metod för att begränsa antalet dokument som returneras när du frågar efter den här samlingen.

Exempel:

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 använder aggregeringspipelinen kan du använda $limit aggregeringsoperatör för att begränsa resultaten som skickas till nästa steg i pipelinen.

Exempel:

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

Exempel:

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

Vanligtvis är $match operatören skulle inte bestå av ett tomt dokument som vi har här. Det skulle normalt inkludera en fråga för att filtrera resultaten på den delen av pipelinen. Men i det här fallet använde jag ett tomt dokument för att göra exemplet lättare att följa.

Med tanke på att jag klarade ett tomt dokument i det första steget kunde jag bara ha gjort så här:

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

Hur som helst var resultatet begränsat till bara 3 dokument.

När $limit används i aggregeringspipelinen operatören kan vara någonstans i mitten av pipelinen. Om så är fallet skickar den de begränsade dokumenten till nästa steg.

Här är ett exempel för att illustrera vad jag menar.

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

Resultat:

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

Endast en katt var med i de begränsade resultaten (även om det finns två katter i originaldokumentet) så endast den katten matchades i det tredje steget.

Detta skiljer sig från att göra följande.

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 det här fallet sökte vi efter katter i originaldokumentet och begränsade sedan resultaten till bara 3. Eftersom det bara finns 2 katter, är $limit hade ingen inverkan på resultatet.

Begränsning av sorterade dokument

Om du begränsar resultaten efter att du har sorterat dokumenten, kommer gränsen att ta hänsyn till sorteringen.

Exempel:

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 det här fallet sorterade jag alla dokument efter deras _id fältet i fallande ordning (-1 anger fallande ordning).

Här är det återigen i stigande ordning (värdet 1). anger stigande ordning):

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änsar resultat efter att de uttryckligen har sorterats, se till att sorteringsoperationen använde en stabil sortering.

En stabil sort är en som returnerar samma sorteringsordning varje gång den utförs. En instabil sortering å andra sidan, är en som kan returnera en annan sorteringsordning när den utförs flera gånger.

För att säkerställa att du utför en stabil sortering, inkludera minst ett fält i din sortering som innehåller exklusivt unika värden (till exempel _id fält).

Mer information

För mer information, se MongoDB-dokumentationen för:

  • cursor.limit()
  • $limit (aggregation)

  1. Hur ökar man Redis prestanda när 100% CPU? Sharding? Snabbaste .Net-klienten?

  2. Hur man testar selleri med django på en Windows-maskin

  3. Hur fungerar ServiceStack PooledRedisClientManager failover?

  4. PostgreSQL vs. MongoDB