Signatur
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
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);
};
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'));
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'));
// Wichtig · Fallstricke
- Ist
keykein gültiger Schlüssel und keinIDBKeyRange, wird synchron einDataErrorgeworfen.null,undefined, Objekte undNaNsind unzulässig. - Wurde der Index gelöscht oder die Transaktion ist bereits beendet, kommt es zu
InvalidStateErrorbzw.TransactionInactiveError. RufegetKey()deshalb nicht nach einemawaitauf, das nicht zu IndexedDB gehört (etwafetch), weil sich die Transaktion sonst automatisch schließt. result === undefinedheiß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.