MongoDB - objęte zapytaniami

W tym rozdziale dowiemy się o zadawanych zapytaniach.

Co to jest objęte zapytaniem?

Zgodnie z oficjalną dokumentacją MongoDB, objęte zapytaniem jest zapytanie, w którym -

  • Wszystkie pola w zapytaniu są częścią indeksu.
  • Wszystkie pola zwrócone w zapytaniu znajdują się w tym samym indeksie.

Ponieważ wszystkie pola obecne w zapytaniu są częścią indeksu, MongoDB dopasowuje warunki zapytania i zwraca wynik przy użyciu tego samego indeksu bez faktycznego zaglądania do dokumentów. Ponieważ indeksy są obecne w pamięci RAM, pobieranie danych z indeksów jest znacznie szybsze w porównaniu do pobierania danych przez skanowanie dokumentów.

Korzystanie z zapytań objętych zakresem

Aby przetestować objęte zapytania, rozważ następujący dokument w users kolekcja -

{
   "_id": ObjectId("53402597d852426020000003"),
   "contact": "987654321",
   "dob": "01-01-1991",
   "gender": "M",
   "name": "Tom Benzamin",
   "user_name": "tombenzamin"
}

Najpierw utworzymy indeks złożony dla users zbiór na polach gender i user_name używając następującego zapytania -

>db.users.createIndex({gender:1,user_name:1})
{
	"createdCollectionAutomatically" : false,
	"numIndexesBefore" : 1,
	"numIndexesAfter" : 2,
	"ok" : 1
}

Teraz ten indeks obejmie następujące zapytanie -

>db.users.find({gender:"M"},{user_name:1,_id:0})
{ "user_name" : "tombenzamin" }

Oznacza to, że w przypadku powyższego zapytania MongoDB nie szukałby dokumentów bazy danych. Zamiast tego pobierałby wymagane dane z indeksowanych danych, co jest bardzo szybkie.

Ponieważ nasz indeks nie obejmuje _idfield, wyraźnie wykluczyliśmy je z zestawu wyników naszego zapytania, ponieważ MongoDB domyślnie zwraca pole _id w każdym zapytaniu. Zatem następujące zapytanie nie zostałoby uwzględnione w utworzonym powyżej indeksie -

>db.users.find({gender:"M"},{user_name:1})
{ "_id" : ObjectId("53402597d852426020000003"), "user_name" : "tombenzamin" }

Na koniec pamiętaj, że indeks nie może obejmować zapytania, jeśli -

  • Każde z indeksowanych pól jest tablicą
  • Każde z indeksowanych pól jest dokumentem podrzędnym