sql >> Database >  >> NoSQL >> MongoDB

2 manieren om de geretourneerde documenten in MongoDB te beperken

Wanneer u query's uitvoert in MongoDB, hebt u de mogelijkheid om de geretourneerde documenten te beperken. Hier geeft u een maximum aantal documenten op dat door de bewerking moet worden geretourneerd.

Als een bewerking bijvoorbeeld normaal 2.000 documenten retourneert, maar u een limiet van 1.000 opgeeft, worden er slechts 1.000 documenten geretourneerd. Als de bewerking echter slechts 500 documenten retourneert, worden alle 500 geretourneerd (omdat ze de limiet van 1000 documenten niet overschrijden).

Dit lijkt een beetje op het gebruik van de TOP clausule in SQL Server, of de LIMIT clausule in MySQL, MariaDB, PostgreSQL en SQLite.

Door het aantal geretourneerde documenten te beperken, kunnen de prestaties worden verbeterd door te voorkomen dat er meer documenten worden geretourneerd en verwerkt dan nodig is.

In MongoDB kunnen we de cursor.limit() . gebruiken methode of de $limit aggregatie-operator om de geretourneerde documenten te beperken.

De cursor.limit() Methode

Stel dat we een verzameling hebben met de naam pets met de volgende documenten:

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

We kunnen de limit() . gebruiken methode om het aantal geretourneerde documenten te beperken bij het opvragen van deze verzameling.

Voorbeeld:

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

Resultaat:

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

De $limit Aggregatie-operator

Wanneer u de aggregatiepijplijn gebruikt, kunt u de $limit . gebruiken aggregatie-operator om de resultaten die worden doorgegeven aan de volgende fase in de pijplijn te beperken.

Voorbeeld:

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

Voorbeeld:

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

Meestal is de $match operator zou niet bestaan ​​uit een leeg document zoals we hier hebben. Het zou normaal gesproken een query bevatten waarmee de resultaten in dat deel van de pijplijn kunnen worden gefilterd. Maar in dit geval heb ik een leeg document gebruikt om het voorbeeld gemakkelijker te volgen te maken.

Aangezien ik in de eerste fase een leeg document heb doorgegeven, had ik dit gewoon kunnen doen:

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

Hoe dan ook, het resultaat was beperkt tot slechts 3 documenten.

Bij gebruik in de aggregatiepijplijn, de $limit operator kan ergens in het midden van de pijpleiding zitten. Als dat zo is, gaat het de beperkte documenten door naar de volgende fase.

Hier is een voorbeeld om te illustreren wat ik bedoel.

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

Resultaat:

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

Slechts één kat zat in de beperkte resultaten (ook al zijn er twee katten in het originele document), dus alleen die kat werd gematcht in de derde fase.

Dit is iets anders dan het volgende doen.

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

Resultaat:

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

In dit geval hebben we naar katten gezocht in het originele document en vervolgens de resultaten beperkt tot slechts 3. Aangezien er maar 2 katten zijn, is de $limit had geen invloed op het resultaat.

Gesorteerde documenten beperken

Als u de resultaten beperkt na het sorteren van de documenten, dan houdt de limiet rekening met de sortering.

Voorbeeld:

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

Resultaat:

{ "_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 dit geval heb ik alle documenten gesorteerd op hun _id veld in aflopende volgorde (de -1 specificeert aflopende volgorde).

Hier is het weer in oplopende volgorde (een waarde van 1 specificeert oplopende volgorde):

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

Resultaat:

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

Wanneer u resultaten beperkt nadat ze expliciet zijn gesorteerd, moet u ervoor zorgen dat de sorteerbewerking een stabiele sortering heeft gebruikt.

Een stabiele sortering is er een die elke keer dat deze wordt uitgevoerd dezelfde sorteervolgorde retourneert. Een instabiele sortering aan de andere kant, is er een die een andere sorteervolgorde kan retourneren wanneer deze meerdere keren wordt uitgevoerd.

Om ervoor te zorgen dat u een stabiele sortering uitvoert, moet u ten minste één veld in uw sortering opnemen dat uitsluitend unieke waarden bevat (bijvoorbeeld de _id veld).

Meer informatie

Zie voor meer informatie de MongoDB-documentatie voor:

  • cursor.limit()
  • $limit (aggregatie)

  1. Tips voor het opslaan van MongoDB-back-ups in de cloud

  2. Waarom hebben we nodig, welke voordelen om mangoest te gebruiken?

  3. Redis 10x meer geheugengebruik dan data

  4. mongoDB:een object-ID maken voor elk nieuw kind dat aan het array-veld wordt toegevoegd