Start · Sprachen · JavaScript · Referenz · IDBObjectStore.index()

IDBObjectStore.index()

Methode

Gibt das <code>IDBIndex</code>-Objekt für einen benannten Index des aktuellen Objekt-Stores zurück, um Datensätze über ein anderes Feld als den Primärschlüssel abzufragen.

seit JavaScript Baseline: alle Browser (IndexedDB 2.0) Kategorie: webapi

Signatur

IDBObjectStore.prototype.index(name)

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

Typ
IDBIndex
Beschreibung
Ein 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);
};
{ id: 1, name: "Anna", email: "anna@example.de" }

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`);
3 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();
  }
};
2024-03-12 49.9 2024-02-01 19.5

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");
}
email true

// Wichtig · Fallstricke

  • NotFoundError (DOMException): wird ausgelöst, wenn es keinen Index mit diesem Namen gibt. Mit store.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 await auf etwas anderes als eine IndexedDB-Anfrage (z. B. fetch()) ist die Transaktion oft schon inaktiv, dann schlägt index() 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.