Zum Hauptinhalt springen

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>
)
FeldBeschreibung
<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_"
}
]
EigenschaftBeschreibung
vinterne Version der Indexstruktur
key