MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

2 sposoby na ograniczenie dokumentów zwracanych w MongoDB

Podczas uruchamiania zapytań W MongoDB masz możliwość ograniczenia zwracanych dokumentów. W tym miejscu określasz maksymalną liczbę dokumentów, które mają zostać zwrócone przez operację.

Na przykład, jeśli operacja normalnie zwróciłaby 2000 dokumentów, ale określisz limit 1000, zwróconych zostanie tylko 1000 dokumentów. Jeśli jednak operacja zwróci powiedzmy tylko 500 dokumentów, wszystkie 500 zostaną zwrócone (ponieważ nie przekraczają limitu 1000 dokumentów).

To trochę jak użycie TOP klauzula w SQL Server lub LIMIT klauzula w MySQL, MariaDB, PostgreSQL i SQLite.

Ograniczenie zwracanych dokumentów może pomóc poprawić wydajność, zapobiegając zwracaniu i przetwarzaniu większej liczby dokumentów niż jest to konieczne.

W MongoDB możemy użyć cursor.limit() metoda lub $limit operator agregacji, aby ograniczyć zwracane dokumenty.

cursor.limit() Metoda

Załóżmy, że mamy kolekcję o nazwie pets z następującymi dokumentami:

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

Możemy użyć limit() metoda, aby ograniczyć liczbę dokumentów zwracanych podczas odpytywania tej kolekcji.

Przykład:

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

Wynik:

{ "_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 Operator agregacji

Korzystając z potoku agregacji, możesz użyć $limit operator agregacji, aby ograniczyć wyniki przekazywane do następnego etapu w potoku.

Przykład:

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

Przykład:

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

Zazwyczaj $match operator nie składałby się z pustego dokumentu, jaki mamy tutaj. Zwykle zawiera zapytanie, za pomocą którego można filtrować wyniki w tej części potoku. Ale w tym przypadku użyłem pustego dokumentu, aby ułatwić naśladowanie przykładu.

Biorąc pod uwagę, że w pierwszym etapie zdałem pusty dokument, mogłem po prostu to zrobić:

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

Tak czy inaczej, wynik był ograniczony do zaledwie 3 dokumentów.

W przypadku użycia w potoku agregacji $limit operator może znajdować się gdzieś pośrodku rurociągu. Jeśli tak, przekazuje ograniczone dokumenty do następnego etapu.

Oto przykład ilustrujący, o co mi chodzi.

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

Wynik:

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

Tylko jeden kot był w ograniczonych wynikach (mimo że w oryginalnym dokumencie są dwa koty), więc tylko ten kot został dopasowany na trzecim etapie.

Różni się to od wykonywania poniższych czynności.

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

Wynik:

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

W tym przypadku szukaliśmy kotów w oryginalnym dokumencie, a następnie ograniczyliśmy wyniki do zaledwie 3. Biorąc pod uwagę, że są tylko 2 koty, $limit nie miało wpływu na wynik.

Ograniczenie sortowanych dokumentów

Jeśli ograniczysz wyniki po posortowaniu dokumentów, limit będzie uwzględniał sortowanie.

Przykład:

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

Wynik:

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

W tym przypadku posortowałem wszystkie dokumenty według ich _id pole w porządku malejącym (-1 określa kolejność malejącą).

Tutaj znowu jest w porządku rosnącym (wartość 1 określa kolejność rosnącą):

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

Wynik:

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

Ograniczając wyniki po ich jawnym posortowaniu, upewnij się, że operacja sortowania używa stabilnego sortowania.

stabilne sortowanie to taki, który zwraca ten sam porządek sortowania za każdym razem, gdy jest wykonywany. niestabilne sortowanie z drugiej strony to taki, który może zwrócić inną kolejność sortowania, gdy jest wykonywany wiele razy.

Aby upewnić się, że przeprowadzasz stabilne sortowanie, uwzględnij w sortowaniu co najmniej jedno pole, które zawiera wyłącznie unikalne wartości (na przykład _id pole).

Więcej informacji

Więcej informacji można znaleźć w dokumentacji MongoDB:

  • cursor.limit()
  • $limit (agregacja)

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. szukaj według ObjectId w mongodb z pymongo

  2. Utwórz klaster baz danych w chmurze za pomocą MongoDB Atlas

  3. mongodb c# jak pracować z dokumentem BSON

  4. Uzyskaj najnowszy rekord MongoDB według pola daty i godziny

  5. konwersja bazy danych z mysql do mongoDb