Indexing
- full collection scan
- Durchsuchung aller Dokumente
- wenn MongoDB keine Indexierung auf einer Eigenschaft einer Collection hat
- unterstützte Indexarten
- Single Index
- Compound Index
- Geospatial Index
- Text-Index
- Clustered Index
- ...
- Realisierung
- meiste Indexarten: als B-Tree-Index
- auch unterstützt: als Hash-Index
Index erstellen
- Standard-Name des Indexes:
<Attributnamen>_<1|-1>
db.collection.createIndex(
{ <field>: <type>, ... },
{
unique: <boolean>,
name: <string>,
partialFilterExpression: <document>,
sparse: <boolean>,
expireAfterSeconds: <number>,
storageEngine: <document>,
collation: <document>,
key: <document>,
...
},
<commitQuorum>
)
Feld | Beschreibung |
---|---|
<field> | Eigenschaft/Feld für Indexierung |
<type> | -1: descending, 1: ascending |
Single field Index
- Basis: B-Tree
- unterstützte Filteroperationen
<
<=
=
!=
db.collection.createIndex( { <field>: <type> } )
Beispiel:
db.collection.createIndex( { state: -1 } )
Compound Index
- Index auf mehreren Feldern
- Index mit mehreren Sortierebenen
- Reihenfolge der Felder ist wichtig
- Index enthält zuerst Referenzen auf Dokumente des ersten Feldes, dann innerhalb gleicher Feld-Werte auf das zweite Feld, usw.
- Index wird nur genutzt, wenn alle Felder in der Query vorkommen
db.collection.createIndex( { <field>: <type>, ... } )
Beispiel:
db.collection.createIndex( { firstName: -1, "location.city": 1 } )
Text Index
- ermöglicht Volltext-Suche auf Textfeldern
db.collection.createIndex( { "<field>": "text" } )
Beispiel:
db.collection.createIndex( { "name": "text", "description": "text" } )
Abfrage:
db.collection.find( { $text: { $search: "search string" } } )
Hinweis: Es werden auch Dokumente zurückgegeben, welche das Suchwort nicht exakt enthalten.
Beispiel: Suchwort "spiced" findet auch "spice", "spices", ...
Um die Mass für die Güte des Matches zu erhalten, kann man das Meta-Datum textScore
zurückgeben lassen.
Wenn man dann nach diesem Metadatenfeld sortieren möchte, muss man das Datenfeld explizit nochmals mit $meta
abrufen,
da dieses Feld nur bei der $text
-Suche verfügbar ist.
db.collection.find(
{
$text: {
$search: "spiced"
}
},
{
score: {
$meta: "textScore"
}
}
).sort({
score: {
$meta: "textScore"
}
})
Somit wird ein zusätzliches Feld score
mit dem Wert textScore
zurückgegeben.
Der textScore
sagt aus, wie gut ein Dokument mit der Suche matcht.
Hashed Index
- unterstütze Operationen
- =
- !=
- mögliche Anwendung: Sharding Szenarios
- Dokumente werden auf verschiedene Server verteilt, um Zugriffszeiten ortsabhängig zu verkürzen
db.collection.createIndex( { <field>: "hashed" } )
Beispiel:
db.collection.createIndex( { name: "hashed" } )
Index löschen
db.collection.dropIndex( "<index>" )
Indexes auflisten
db.collection.getIndexes()
Ausgabe:
[
{
v: 2,
key: { _id: 1 },
name: "_id_"
}
]
Eigenschaft | Beschreibung |
---|---|
v | interne Version der Indexstruktur |
key | |