MongoDB Indizes

6 Kernkonzepte
Die wichtigsten MongoDB Index-Typen und -Strategien: Single Field · Compound · Text · Geospatial · Unique · Partial Indizes sind der Schlüssel zu performanten MongoDB-Abfragen. Sie beschleunigen Leseoperationen, ermöglichen Sortierungen und unterstützen spezielle Abfragen wie Textsuche und Geodaten.

Single Field Indizes – Einzelne Felder

createIndex( { feld: 1 } )
// Aufsteigender Index auf dem Feld "name" db.kunden.createIndex({ name: 1 }) // Absteigender Index auf dem Feld "alter" db.kunden.createIndex({ alter: -1 })

Single Field Indizes werden auf einem einzelnen Feld angelegt. Die Richtung (1 = aufsteigend, -1 = absteigend) beeinflusst die Sortierreihenfolge.

Beispiele
// Index auf "email" (für schnelle Suche)
db.users.createIndex({ email: 1 }, { unique: true })
// Index auf "createdAt" für Sortierung
db.orders.createIndex({ createdAt: -1 })
// Index auf eingebettetem Feld
db.users.createIndex({ "address.city": 1 })
// Indizes auflisten
db.users.getIndexes()
// Index löschen
db.users.dropIndex({ email: 1 })
Tipp: Der _id-Index wird automatisch erstellt. Für häufige Abfragen auf anderen Feldern sollten Sie gezielt Indizes anlegen.

Compound Indizes – Mehrere Felder

createIndex( { feld1: 1, feld2: -1 } )
// Zusammengesetzter Index auf "kategorie" und "preis" db.produkte.createIndex({ kategorie: 1, preis: -1 }) // Sortierung: kategorie aufsteigend, preis absteigend

Compound Indizes umfassen mehrere Felder. Die Reihenfolge der Felder ist entscheidend für die Effizienz der Abfragen. Sie unterstützen Sortierungen, die der Indexreihenfolge entsprechen.

Beispiele
// Index für Abfragen mit kategorie + preis
db.produkte.createIndex({ kategorie: 1, preis: -1 })
// Index für (kategorie, preis) und (kategorie) funktioniert
// db.produkte.find({ kategorie: "Elektronik" }).sort({ preis: -1 })
// Index für (kategorie) und (preis) – NUR der erste funktioniert
// db.produkte.find({ preis: 100 }) – KEIN Index
// Mit eingebetteten Feldern
db.orders.createIndex({ "customer.name": 1, total: -1 })
Tipp: Die Reihenfolge der Felder in einem Compound Index ist wichtig. Platzieren Sie das Feld, das am häufigsten als Filter verwendet wird, an erster Stelle.

Text Indizes – Volltextsuche

createIndex( { feld: "text" } )
// Text-Index auf "beschreibung" und "name" db.artikel.createIndex({ beschreibung: "text", name: "text" }) // Suche: db.artikel.find({ $text: { $search: "MongoDB Datenbank" } })

Text Indizes ermöglichen Volltextsuche in String-Feldern. Sie unterstützen Stemming, Stoppwörter und die Suche nach Phrasen.

Beispiele
// Text-Index auf mehreren Feldern
db.artikel.createIndex({ titel: "text", inhalt: "text" })
// Einfache Suche (alle Wörter müssen vorkommen)
db.artikel.find({ $text: { $search: "MongoDB Datenbank" } })
// Phrasensuche (genaue Wortfolge)
db.artikel.find({ $text: { $search: "\"MongoDB Indizes\"" } })
// Ausschluss von Wörtern
db.artikel.find({ $text: { $search: "MongoDB -Datenbank" } })
// Mit Projektion (Relevanz-Score)
db.artikel.find(
{ $text: { $search: "MongoDB" } },
{ score: { $meta: "textScore" } }
)
// Sortierung nach Relevanz
db.artikel.find(
{ $text: { $search: "MongoDB" } },
{ score: { $meta: "textScore" } }
).sort({ score: { $meta: "textScore" } })
Tipp: Eine Collection kann nur einen Text-Index haben. Sie können mehrere Felder in einem Text-Index kombinieren, aber nicht mehrere separate Text-Indizes erstellen.

Geospatial Indizes – Koordinatenabfragen

2dsphere · 2d · geoNear
// 2dsphere-Index für GeoJSON-Daten db.orte.createIndex({ "location": "2dsphere" }) // Abfrage: Orte in der Nähe db.orte.find({ location: { $near: { $geometry: { type: "Point", coordinates: [13.404, 52.520] }, $maxDistance: 5000 } } })

Geospatial Indizes ermöglichen Abfragen basierend auf geografischen Koordinaten. 2dsphere unterstützt GeoJSON-Daten (Erdkrümmung), 2d für ebene Koordinaten.

Beispiele
// 2dsphere-Index für GeoJSON
db.restaurants.createIndex({ "location": "2dsphere" })
// $near: Orte in der Nähe
db.restaurants.find({
location: {
$near: {
$geometry: { type: "Point", coordinates: [-73.9667, 40.78] },
$maxDistance: 1000
}
}
})
// $geoWithin: Punkte innerhalb eines Polygons
db.restaurants.find({
location: {
$geoWithin: {
$geometry: {
type: "Polygon",
coordinates: [[ [-74.0, 40.7], [-73.9, 40.7], [-73.9, 40.8], [-74.0, 40.8], [-74.0, 40.7] ]]
}
}
}
})
Tipp: 2dsphere unterstützt GeoJSON-Daten (Type: "Point", "Polygon" etc.) und berücksichtigt die Erdkrümmung. Für Legacy-Daten mit [lng, lat]-Arrays verwenden Sie 2d.

Spezielle Indizes – Unique, Partial, TTL, Wildcard

unique · partialFilterExpression · expireAfterSeconds
// Unique Index db.users.createIndex({ email: 1 }, { unique: true }) // Partial Index (nur für bestimmte Dokumente) db.users.createIndex({ age: 1 }, { partialFilterExpression: { age: { $gte: 18 } } }) // TTL Index (automatisches Löschen) db.logs.createIndex({ createdAt: 1 }, { expireAfterSeconds: 3600 })

Spezielle Indizes erweitern die Funktionalität: unique verhindert Duplikate, partial indexiert nur einen Teil der Dokumente, TTL löscht automatisch veraltete Dokumente.

Beispiele
// Unique Index (verhindert doppelte E-Mails)
db.users.createIndex({ email: 1 }, { unique: true })
// Unique + Sparese (nur Dokumente mit email)
db.users.createIndex({ email: 1 }, { unique: true, sparse: true })
// Partial Index (nur Kunden mit aktivem Status)
db.kunden.createIndex({ letzter_kauf: -1 }, {
partialFilterExpression: { status: "aktiv" }
})
// TTL Index (automatisches Löschen nach 7 Tagen)
db.sessions.createIndex({ lastAccess: 1 }, { expireAfterSeconds: 604800 })
// Wildcard Index (alle Felder in einem Dokument)
db.produkte.createIndex({ "$**": 1 })
// Case Insensitive Index
db.users.createIndex({ name: 1 }, { collation: { locale: "de", strength: 2 } })
Tipp: TTL-Indizes sind ideal für temporäre Daten wie Sessions, Logs oder Caches. Der Löschprozess läuft im Hintergrund und löscht Dokumente nach dem angegebenen Zeitraum.

Index-Management – Überwachen, Analysieren, Optimieren

getIndexes · explain · dropIndex · createIndexes
// Alle Indizes einer Collection anzeigen db.produkte.getIndexes() // Abfrageplan anzeigen (Index-Nutzung prüfen) db.produkte.find({ preis: { $gt: 100 } }).explain("executionStats")

Index-Management umfasst das Anlegen, Anzeigen, Löschen und Analysieren von Indizes, um die Abfrageperformance zu optimieren.

Beispiele
// Alle Indizes einer Collection
db.users.getIndexes()
// Index existiert?
db.users.getIndexes().some(i => i.name === "email_1")
// Einzelnen Index löschen (nach Name)
db.users.dropIndex("email_1")
// Alle Indizes außer _id löschen
db.users.dropIndexes()
// Index im Hintergrund erstellen (nicht blockierend)
db.largeCollection.createIndex({ feld: 1 }, { background: true })
// Abfrageplan analysieren
db.orders.find({ customerId: "123" }).explain("executionStats")
// Indizes auf versteckte Felder prüfen
db.produkte.createIndex({ "attribute": 1 }, { hidden: true })
Tipp: Verwenden Sie explain("executionStats"), um zu prüfen, ob Ihre Abfrage einen Index verwendet. Suchen Sie nach "stage": "IXSCAN" im Ausgabeplan.

MongoDB Indizes im Überblick

1 / -1 Sortierrichtung
Aufsteigend / Absteigend
Compound Mehrere Felder
Reihenfolge wichtig
Text Volltextsuche
$text, $search
2dsphere Geodaten
$near, $geoWithin
TTL Automatisches Löschen
expireAfterSeconds
explain Abfrageanalyse
performance prüfen

Quick Summary

Single
Einzelnes Feld
Compound
Mehrere Felder
Text
Volltextsuche
2dsphere
Geodaten
Unique
Eindeutigkeit
explain
Analyse
db.collection.createIndex({ feld: 1 }) · db.collection.find({ ... }).explain("executionStats")