MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

2 Möglichkeiten zur Begrenzung der in MongoDB zurückgegebenen Dokumente

Wenn Sie Abfragen in MongoDB ausführen, haben Sie die Möglichkeit, die zurückgegebenen Dokumente einzuschränken. Hier geben Sie eine maximale Anzahl von Dokumenten an, die vom Vorgang zurückgegeben werden sollen.

Wenn ein Vorgang beispielsweise normalerweise 2.000 Dokumente zurückgeben würde, Sie jedoch ein Limit von 1.000 angeben, werden nur 1.000 Dokumente zurückgegeben. Wenn der Vorgang jedoch nur sagen wir 500 Dokumente zurückgeben würde, dann werden alle 500 zurückgegeben (weil sie die Grenze von 1.000 Dokumenten nicht überschreiten).

Dies ist ein bisschen wie die Verwendung von TOP -Klausel in SQL Server oder das LIMIT -Klausel in MySQL, MariaDB, PostgreSQL und SQLite.

Durch die Begrenzung der zurückgegebenen Dokumente kann die Leistung verbessert werden, indem verhindert wird, dass mehr Dokumente als erforderlich zurückgegeben und verarbeitet werden.

In MongoDB können wir cursor.limit() verwenden -Methode oder $limit Aggregationsoperator, um die zurückgegebenen Dokumente zu begrenzen.

Der cursor.limit() Methode

Angenommen, wir haben eine Sammlung namens pets mit folgenden Dokumenten:

{ "_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 }

Wir können das limit() verwenden Methode, um die Anzahl der zurückgegebenen Dokumente beim Abfragen dieser Sammlung zu begrenzen.

Beispiel:

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

Ergebnis:

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

Das $limit Aggregationsoperator

Wenn Sie die Aggregationspipeline verwenden, können Sie das $limit verwenden Aggregationsoperator, um die Ergebnisse zu begrenzen, die an die nächste Stufe in der Pipeline übergeben werden.

Beispiel:

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

Beispiel:

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

Typischerweise das $match Operator würde nicht aus einem leeren Dokument bestehen, wie wir es hier haben. Normalerweise würde es eine Abfrage enthalten, mit der die Ergebnisse in diesem Teil der Pipeline gefiltert werden. Aber in diesem Fall habe ich ein leeres Dokument verwendet, um das Beispiel leichter nachvollziehen zu können.

Da ich in der ersten Phase ein leeres Dokument übergeben habe, hätte ich einfach Folgendes tun können:

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

So oder so war das Ergebnis auf nur 3 Dokumente beschränkt.

Bei Verwendung in der Aggregationspipeline ist das $limit Betreiber könnte irgendwo in der Mitte der Pipeline sein. Wenn dies der Fall ist, übergibt es die begrenzten Dokumente an die nächste Stufe.

Hier ist ein Beispiel, um zu veranschaulichen, was ich meine.

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

Ergebnis:

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

Nur eine Katze war in den begrenzten Ergebnissen (obwohl es zwei Katzen im Originaldokument gibt), also wurde nur diese Katze in der dritten Phase abgeglichen.

Dies unterscheidet sich von den folgenden Aktionen.

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

Ergebnis:

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

In diesem Fall haben wir im Originaldokument nach Katzen gesucht und dann die Ergebnisse auf nur 3 beschränkt. Da es nur 2 Katzen gibt, ist das $limit hatte keinen Einfluss auf das Ergebnis.

Sortierte Dokumente einschränken

Wenn Sie die Ergebnisse nach dem Sortieren der Dokumente einschränken, berücksichtigt die Grenze die Sortierung.

Beispiel:

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

Ergebnis:

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

In diesem Fall habe ich alle Dokumente nach ihrer _id sortiert Feld in absteigender Reihenfolge (die -1 gibt absteigende Reihenfolge an).

Hier wieder in aufsteigender Reihenfolge (ein Wert von 1 gibt aufsteigende Reihenfolge an):

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

Ergebnis:

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

Wenn Sie Ergebnisse einschränken, nachdem sie explizit sortiert wurden, stellen Sie sicher, dass der Sortiervorgang eine stabile Sortierung verwendet hat.

Eine stabile Sorte ist eine, die bei jeder Ausführung dieselbe Sortierreihenfolge zurückgibt. Eine instabile Sortierung andererseits ist eine, die bei mehrmaliger Ausführung möglicherweise eine andere Sortierreihenfolge zurückgibt.

Um sicherzustellen, dass Sie eine stabile Sortierung durchführen, fügen Sie mindestens ein Feld in Ihre Sortierung ein, das ausschließlich eindeutige Werte enthält (z. B. die _id Feld).

Weitere Informationen

Weitere Informationen finden Sie in der MongoDB-Dokumentation für:

  • cursor.limit()
  • $limit (Aggregation)