MongoDB - Abgedeckte Abfragen

In diesem Kapitel erfahren Sie mehr über abgedeckte Abfragen.

Was ist eine abgedeckte Abfrage?

Gemäß der offiziellen MongoDB-Dokumentation ist eine abgedeckte Abfrage eine Abfrage, in der -

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

Da alle in der Abfrage vorhandenen Felder Teil eines Index sind, stimmt MongoDB mit den Abfragebedingungen überein und gibt das Ergebnis unter Verwendung desselben Index zurück, ohne tatsächlich in die Dokumente zu schauen. Da Indizes im RAM vorhanden sind, ist das Abrufen von Daten aus Indizes viel schneller als das Abrufen von Daten durch Scannen von Dokumenten.

Abgedeckte Abfragen verwenden

Beachten Sie zum Testen der abgedeckten Abfragen das folgende Dokument in der users Sammlung -

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

Wir werden zuerst einen zusammengesetzten Index für die erstellen users Sammlung auf den Feldern gender und user_name mit der folgenden Abfrage -

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

Dieser Index deckt nun die folgende Abfrage ab:

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

Das heißt, dass MongoDB für die obige Abfrage keine Datenbankdokumente untersuchen würde. Stattdessen würde es die erforderlichen Daten aus indizierten Daten abrufen, was sehr schnell ist.

Da unser Index nicht enthält _idFeld haben wir es explizit aus der Ergebnismenge unserer Abfrage ausgeschlossen, da MongoDB standardmäßig in jeder Abfrage das Feld _id zurückgibt. Die folgende Abfrage wäre also nicht in dem oben erstellten Index enthalten gewesen -

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

Denken Sie zum Schluss daran, dass ein Index eine Abfrage nicht abdecken kann, wenn -

  • Jedes der indizierten Felder ist ein Array
  • Jedes der indizierten Felder ist ein Unterdokument