Signatur
Beschreibung
Mit index() greifst du auf einen Index zu, der zuvor mit IDBObjectStore.createIndex() während eines upgradeneeded-Ereignisses angelegt wurde. Das zurückgegebene IDBIndex-Objekt erlaubt Abfragen wie get(), getAll(), count() oder openCursor() – allerdings über den Index-Schlüssel statt über den Primärschlüssel des Stores.
Typischer Einsatz: Ein Store kunden mit dem Primärschlüssel id hat einen Index email. Über store.index("email").get("a@b.de") findest du einen Kunden direkt über seine E-Mail-Adresse, ohne alle Datensätze durchlaufen zu müssen.
Die Methode arbeitet synchron und startet selbst keine Anfrage – sie liefert nur das Index-Objekt. Erst die Methoden des IDBIndex erzeugen IDBRequest-Objekte. Der Aufruf ist nur innerhalb einer aktiven Transaktion möglich, die den betreffenden Store im Geltungsbereich hat.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $name Pflicht | string | Name des zu öffnenden Index, so wie er bei createIndex() vergeben wurde. Groß-/Kleinschreibung wird beachtet. |
Rückgabewert
IDBIndex-Objekt, über das Datensätze anhand des Index-Schlüssels abgefragt werden können.Beispiele
Index beim Upgrade anlegen und später abfragen
const request = indexedDB.open("shop", 1);
request.onupgradeneeded = (event) => {
const db = event.target.result;
const store = db.createObjectStore("kunden", { keyPath: "id" });
// Eindeutiger Index auf das Feld "email"
store.createIndex("email", "email", { unique: true });
store.add({ id: 1, name: "Anna", email: "anna@example.de" });
};
request.onsuccess = (event) => {
const db = event.target.result;
const tx = db.transaction("kunden", "readonly");
const index = tx.objectStore("kunden").index("email");
const getReq = index.get("anna@example.de");
getReq.onsuccess = () => console.log(getReq.result);
};
Alle Treffer eines nicht eindeutigen Index mit Promise-Wrapper
const promisify = (req) => new Promise((resolve, reject) => {
req.onsuccess = () => resolve(req.result);
req.onerror = () => reject(req.error);
});
const produkteNachKategorie = async (db, kategorie) => {
const store = db.transaction("produkte").objectStore("produkte");
// Index "kategorie" wurde mit { unique: false } angelegt
return promisify(store.index("kategorie").getAll(kategorie));
};
// Aufruf
const liste = await produkteNachKategorie(db, "Bücher");
console.log(`${liste.length} Bücher gefunden`);
Cursor über einen Index mit Schlüsselbereich
const tx = db.transaction("bestellungen", "readonly");
const index = tx.objectStore("bestellungen").index("datum");
// Alle Bestellungen ab dem 1. Januar 2024, absteigend sortiert
const range = IDBKeyRange.lowerBound("2024-01-01");
index.openCursor(range, "prev").onsuccess = (event) => {
const cursor = event.target.result;
if (cursor) {
console.log(cursor.key, cursor.value.summe);
cursor.continue();
}
};
Vorhandene Indizes vor dem Zugriff prüfen
const store = db.transaction("kunden").objectStore("kunden");
if (store.indexNames.contains("email")) {
const index = store.index("email");
console.log(index.keyPath, index.unique);
} else {
console.warn("Index 'email' existiert nicht");
}
// Wichtig · Fallstricke
NotFoundError(DOMException): wird ausgelöst, wenn es keinen Index mit diesem Namen gibt. Mitstore.indexNames.contains(name)lässt sich das vorher prüfen.InvalidStateError: wird ausgelöst, wenn der Store gelöscht wurde oder die Transaktion bereits abgeschlossen ist.- Transaktionen werden automatisch abgeschlossen, sobald keine Anfragen mehr offen sind. Nach einem
awaitauf etwas anderes als eine IndexedDB-Anfrage (z. B.fetch()) ist die Transaktion oft schon inaktiv, dann schlägtindex()fehl. - Indizes lassen sich nur im
versionchange-Modus (onupgradeneeded) anlegen oder löschen.index()selbst funktioniert in jedem Transaktionsmodus. - Datensätze, deren Index-Feld fehlt oder keinen gültigen Schlüssel enthält, erscheinen nicht im Index.
- Kompatibilität: wird von allen modernen Browsern und in Web Workern unterstützt. Im privaten Modus älterer Safari-/Firefox-Versionen war IndexedDB teilweise nicht verfügbar.