Start · Sprachen · JavaScript · Referenz · IDBIndex.getKey()

IDBIndex.getKey()

Methode

Sucht asynchron im Index nach einem Schlüssel oder Schlüsselbereich und liefert über ein <code>IDBRequest</code> den Primärschlüssel des ersten passenden Datensatzes.

seit JavaScript Baseline: alle Browser Kategorie: webapi

Signatur

IDBIndex.prototype.getKey(key)

Beschreibung

getKey() durchsucht einen IDBIndex nach dem angegebenen Indexschlüssel bzw. nach dem ersten Eintrag innerhalb eines IDBKeyRange und liefert den zugehörigen Primärschlüssel des Datensatzes im Object Store, nicht den Datensatz selbst. Das Ergebnis steht nach dem success-Ereignis in request.result.

Die Methode eignet sich immer dann, wenn man nur wissen will, welcher Datensatz zu einem Indexwert gehört, etwa um zu prüfen, ob eine E-Mail-Adresse schon vergeben ist, oder um den Primärschlüssel für ein späteres put() oder delete() zu ermitteln. Weil der Wert nicht deserialisiert werden muss, ist das bei großen Objekten deutlich günstiger als get().

Passen mehrere Einträge, wird nur der erste in Indexreihenfolge zurückgegeben. Die Reihenfolge ergibt sich aus dem Indexschlüssel, bei gleichem Indexschlüssel aus dem Primärschlüssel. Wenn nichts passt, ist result gleich undefined. Alle Primärschlüssel zu einem Wert liefert getAllKeys().

Parameter

Name Typ Default Beschreibung
$key Pflicht any | IDBKeyRange Ein gültiger IndexedDB-Schlüssel (number, string, Date, ArrayBuffer, Array) oder ein IDBKeyRange, nach dem im Index gesucht wird.

Rückgabewert

Typ
IDBRequest
Beschreibung
Ein IDBRequest. Bei Erfolg enthält result den Primärschlüssel des ersten passenden Datensatzes, sonst undefined.

Beispiele

Primärschlüssel über eine E-Mail-Adresse ermitteln

const openReq = indexedDB.open('shop', 1);

openReq.onupgradeneeded = () => {
  const db = openReq.result;
  const store = db.createObjectStore('kunden', { keyPath: 'id', autoIncrement: true });
  store.createIndex('email', 'email', { unique: true });
  store.add({ name: 'Anna', email: 'anna@example.de' });
};

openReq.onsuccess = () => {
  const db = openReq.result;
  const index = db.transaction('kunden', 'readonly')
    .objectStore('kunden')
    .index('email');

  const req = index.getKey('anna@example.de');
  req.onsuccess = () => console.log('Primärschlüssel:', req.result);
  req.onerror = () => console.error(req.error);
};
Primärschlüssel: 1

Promise-Wrapper: prüfen, ob ein Wert schon vergeben ist

const requestToPromise = (req) => new Promise((resolve, reject) => {
  req.onsuccess = () => resolve(req.result);
  req.onerror = () => reject(req.error);
});

const istEmailVergeben = async (db, email) => {
  const index = db.transaction('kunden').objectStore('kunden').index('email');
  const key = await requestToPromise(index.getKey(email));
  return key !== undefined;
};

// Verwendung (db ist eine geöffnete IDBDatabase)
// console.log(await istEmailVergeben(db, 'bert@example.de'));
false

Mit IDBKeyRange: ersten Datensatz ab einem Datum finden und löschen

const loescheErstenAb = (db, datum) => {
  const tx = db.transaction('termine', 'readwrite');
  const store = tx.objectStore('termine');
  const req = store.index('datum').getKey(IDBKeyRange.lowerBound(datum));

  req.onsuccess = () => {
    if (req.result === undefined) {
      console.log('Kein Termin gefunden');
      return;
    }
    store.delete(req.result); // Primärschlüssel direkt weiterverwenden
    console.log('Gelöscht:', req.result);
  };
};

// loescheErstenAb(db, new Date('2024-06-01'));
Gelöscht: 42

// Wichtig · Fallstricke

  • Ist key kein gültiger Schlüssel und kein IDBKeyRange, wird synchron ein DataError geworfen. null, undefined, Objekte und NaN sind unzulässig.
  • Wurde der Index gelöscht oder die Transaktion ist bereits beendet, kommt es zu InvalidStateError bzw. TransactionInactiveError. Rufe getKey() deshalb nicht nach einem await auf, das nicht zu IndexedDB gehört (etwa fetch), weil sich die Transaktion sonst automatisch schließt.
  • result === undefined heißt „nicht gefunden“. Der Request schlägt dabei nicht fehl.
  • Bei multiEntry-Indizes wird jedes Array-Element einzeln indiziert, sodass sich ein Datensatz über jedes seiner Elemente finden lässt.
  • Kompatibilität: wird von allen modernen Browsern unterstützt und steht auch in Web Workern zur Verfügung. In manchen privaten Modi älterer Browser ist IndexedDB eingeschränkt.