Signatur
Beschreibung
IDBCursor.key gibt den Schlüssel des Datensatzes zurück, auf dem der Cursor gerade steht. Welcher Schlüssel das ist, hängt von der Quelle des Cursors ab:
- Beim Öffnen auf einem
IDBObjectStore(store.openCursor()bzw.store.openKeyCursor()) istkeyder Primärschlüssel des Datensatzes. - Beim Öffnen auf einem
IDBIndex(index.openCursor()) istkeyder Indexschlüssel, also der Wert amkeyPathdes Index (z. B. eine E-Mail-Adresse). Den Primärschlüssel liefert dannIDBCursor.primaryKey.
Die Eigenschaft eignet sich, um beim Durchlaufen eines Stores Schlüssel zu protokollieren, Datensätze gezielt mit store.delete(cursor.primaryKey) zu bearbeiten oder Schlüsselbereiche zu gruppieren. Bei reinen Schlüssel-Cursors (openKeyCursor()) spart man sich das Laden der Werte – key und primaryKey sind dann die einzigen Daten, die man bekommt, was bei großen Datensätzen deutlich schneller ist.
Der Wert kann jeder gültige IndexedDB-Schlüsseltyp sein: number, string, Date, ArrayBuffer/typisierte Arrays oder ein Array dieser Typen (zusammengesetzte Schlüssel). Die Eigenschaft ist nur innerhalb des success-Handlers der Cursor-Anfrage sinnvoll lesbar, solange die Transaktion aktiv ist.
Rückgabewert
undefined, während der Cursor gerade weiterbewegt wird (nach continue()/advance(), vor dem nächsten success) oder wenn er das Ende seines Bereichs überschritten hat.Beispiele
Alle Primärschlüssel eines Object Stores ausgeben
const request = indexedDB.open('shop', 1);
request.onupgradeneeded = () => {
const db = request.result;
const store = db.createObjectStore('produkte', { keyPath: 'id' });
store.add({ id: 1, name: 'Tastatur' });
store.add({ id: 2, name: 'Maus' });
store.add({ id: 3, name: 'Monitor' });
};
request.onsuccess = () => {
const db = request.result;
const store = db.transaction('produkte', 'readonly').objectStore('produkte');
store.openCursor().onsuccess = (event) => {
const cursor = event.target.result;
if (!cursor) {
console.log('Fertig');
return;
}
console.log(`Schlüssel: ${cursor.key} → ${cursor.value.name}`);
cursor.continue();
};
};
Index-Cursor: key (Indexschlüssel) vs. primaryKey
// Annahme: Store 'kunden' mit keyPath 'id' und Index 'email' auf dem Feld 'email'
const listeKunden = (db) => {
const index = db
.transaction('kunden', 'readonly')
.objectStore('kunden')
.index('email');
index.openCursor().onsuccess = (event) => {
const cursor = event.target.result;
if (!cursor) return;
// key = E-Mail (Indexschlüssel), primaryKey = id
console.log(cursor.key, '→ id', cursor.primaryKey);
cursor.continue();
};
};
Schnell nur Schlüssel in einem Datumsbereich sammeln (Promise-Wrapper)
// Store 'logs' mit Date-Objekten als Primärschlüssel
const schluesselImBereich = (db, von, bis) =>
new Promise((resolve, reject) => {
const keys = [];
const store = db.transaction('logs', 'readonly').objectStore('logs');
const req = store.openKeyCursor(IDBKeyRange.bound(von, bis));
req.onerror = () => reject(req.error);
req.onsuccess = () => {
const cursor = req.result;
if (!cursor) return resolve(keys);
keys.push(cursor.key); // Date-Objekt, Wert wird nicht geladen
cursor.continue();
};
});
// Nutzung:
// const keys = await schluesselImBereich(db, new Date('2024-01-01'), new Date('2024-01-31'));
// console.log(keys.length, keys[0].toISOString());
// Wichtig · Fallstricke
- Index vs. Store: Auf einem Index-Cursor ist
keynicht der Primärschlüssel. Wer Datensätze perstore.get()/store.delete()ansprechen will, brauchtcursor.primaryKey(oder direktcursor.delete()/cursor.update()). - Timing: Nach
cursor.continue()oderadvance()istkeybis zum nächstensuccess-Ereignisundefined. Den Wert also vorher in einer Variablen sichern, wenn er danach noch gebraucht wird. - Transaktion: Cursor-Callbacks dürfen keine
await-Pausen auf fremde Promises (z. B.fetch) enthalten – die Transaktion wird sonst automatisch abgeschlossen und weitere Cursor-Aufrufe werfenTransactionInactiveError. - Wurde der zugrunde liegende Store oder Index gelöscht, wirft der Zugriff eine
InvalidStateError-DOMException. - Schlüssel vom Typ
DateoderArraysind Objekte – für VergleicheindexedDB.cmp(a, b)statt===verwenden. - Kompatibilität: In allen modernen Browsern und in Web Workern verfügbar; in manchen privaten Modi (ältere Safari/Firefox-Versionen) ist IndexedDB eingeschränkt.