MongoDB Fortgeschrittenes Indexing
Betrachten Sie die folgende Dokumentensammlung (users):
{
"address": {
"city": "Los Angeles",
"state": "California",
"pincode": "123"
},
"tags": [
"music",
"cricket",
"blogs"
],
"name": "Tom Benzamin"
}
Die obigen Dokumente enthalten ein address-Unterdokument und ein tags-Array.
Array-Felder indizieren
Angenommen, wir rufen Benutzer basierend auf tags ab. Dafür müssen wir einen Index für das tags-Array in der Collection erstellen.
Das Erstellen eines Index auf einem Array erfordert, nacheinander einen Index für jedes Feld im Array zu erstellen. Wenn wir also einen Index auf dem Array tags erstellen, werden separate Indizes für die drei Werte erstellt: music, cricket und blogs.
Verwenden Sie den folgenden Befehl, um einen Array-Index zu erstellen:
>db.users.ensureIndex({"tags":1})
Nach dem Erstellen des Index können wir das Feld tags der Sammlung wie folgt abrufen:
>db.users.find({tags:"cricket"})
Um zu überprüfen, dass wir den Index verwendet haben, können wir den Befehl explain verwenden:
>db.users.find({tags:"cricket"}).explain()
Wenn das Ausführungsergebnis des obigen Befehls "cursor": "BtreeCursor tags_1" anzeigt, bedeutet das, dass der Index verwendet wurde.
Unterdokumentfelder indizieren
Angenommen, wir müssen Dokumente anhand der Felder city, state und pincode abrufen. Da diese Felder Unterdokumentfelder sind, müssen wir einen Index für das Unterdokument erstellen.
Erstellen Sie mit dem folgenden Befehl einen Index für die drei Felder des Unterdokuments:
>db.users.ensureIndex({"address.city":1,"address.state":1,"address.pincode":1})
Sobald der Index erstellt ist, können wir die Unterdokumentfelder zum Abrufen von Daten verwenden:
>db.users.find({"address.city":"Los Angeles"})
Der Abfrageausdruck muss nicht unbedingt der Reihenfolge des angegebenen Index folgen; MongoDB optimiert ihn automatisch. Der oben erstellte Index unterstützt also die folgenden Abfragen:
>db.users.find({"address.state":"California","address.city":"Los Angeles"})
Er unterstützt auch die folgenden Abfragen:
>db.users.find({"address.city":"Los Angeles","address.state":"California","address.pincode":"123"})
Andere Erweiterungen