MongoDB Covered Query

Die offizielle MongoDB-Dokumentation besagt, dass eine Covered Query eine Abfrage ist, bei der:

  • Alle Abfragefelder sind Teil eines Index
  • Alle in der Abfrage zurückgegebenen Felder befinden sich im selben Index

Da alle in der Abfrage vorkommenden Felder Teil eines Index sind, muss MongoDB nicht die gesamten Datendokumente durchsuchen, um Abfragebedingungen abzugleichen und Abfrageergebnisse unter Verwendung desselben Index zurückzugeben.

Da Indizes im RAM vorhanden sind, ist das Abrufen von Daten aus dem Index viel schneller als das Lesen von Daten durch Scannen von Dokumenten.


Covered Queries verwenden

Um Covered Queries zu testen, verwenden Sie die folgende `users`-Collection:

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

Wir erstellen einen zusammengesetzten Index für die `users`-Collection mit den Feldern `gender` und `user_name`:

>db.users.createIndex({gender:1,user_name:1})

Hinweis:Versionen vor 5.0 können `db.collection.ensureIndex()` verwenden, aber `ensureIndex()` wurde in Version 5.0 entfernt; verwenden Sie stattdessen `createIndex()`.

Nun deckt dieser Index die folgende Abfrage ab:

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

Das heißt, für die obige Abfrage durchsucht MongoDB nicht die Datenbankdateien. Stattdessen extrahiert es Daten aus dem Index, was eine sehr schnelle Datenabfrage ist.

Da unser Index das Feld `_id` nicht enthält, wird `_id` standardmäßig in der Abfrage zurückgegeben. Wir können es aus der Ergebnismenge der MongoDB-Abfrage ausschließen.

Das folgende Beispiel schließt `_id` nicht aus, daher wird die Abfrage nicht abgedeckt:

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

Schließlich können die folgenden Abfragen keine Covered Queries verwenden:

  • Alle Indexfelder sind ein Array
  • Alle Indexfelder sind ein Unterdokument
Andere Erweiterungen