Signatur
Beschreibung
getAllKeys() liefert ein IDBRequest, dessen result nach dem Ereignis success ein Array mit den Primärschlüsseln der passenden Datensätze enthält, nicht die Indexschlüssel und auch nicht die Objekte selbst. Die Reihenfolge richtet sich nach dem Indexschlüssel. Bei gleichen Indexschlüsseln wird zusätzlich nach Primärschlüssel sortiert.
Die Methode ist praktisch, wenn Sie nur wissen müssen, welche Datensätze zu einem Indexwert gehören, etwa um sie danach gezielt zu löschen, sie seitenweise nachzuladen oder mit anderen Daten abzugleichen. Weil die Objekte nicht geladen und deserialisiert werden, ist sie deutlich sparsamer als getAll() und bei großen Treffermengen meist schneller als das Durchlaufen mit einem Cursor.
Mit dem Parameter query filtern Sie nach einem einzelnen Indexschlüssel oder einem Bereich (IDBKeyRange). count begrenzt die Anzahl der Treffer. Einen Versatz (Offset) gibt es nicht. Seitenweises Laden lösen Sie über einen Schlüsselbereich ab dem letzten Treffer oder mit openKeyCursor().
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $query | any | IDBKeyRange | null | undefined (alle Einträge) | Ein gültiger Indexschlüssel oder ein IDBKeyRange, der die Treffer eingrenzt. Bei undefined oder null werden alle Einträge des Index geliefert. |
| $count | number | undefined (unbegrenzt) | Höchstanzahl der zurückgegebenen Schlüssel. Erlaubt sind ganze Zahlen von 0 bis 232−1. 0 oder ein fehlender Wert bedeutet: keine Begrenzung. Werte außerhalb dieses Bereichs lösen einen TypeError aus. |
Rückgabewert
IDBRequest. Nach success enthält request.result ein Array der Primärschlüssel, sortiert nach Indexschlüssel. Gibt es keine Treffer, ist das Array leer.Beispiele
Primärschlüssel aller Kunden einer Stadt
const openReq = indexedDB.open('shop', 1);
openReq.onupgradeneeded = () => {
const db = openReq.result;
const store = db.createObjectStore('kunden', { keyPath: 'id' });
store.createIndex('nachStadt', 'stadt');
store.add({ id: 1, name: 'Anna', stadt: 'Berlin' });
store.add({ id: 2, name: 'Ben', stadt: 'Hamburg' });
store.add({ id: 3, name: 'Clara', stadt: 'Berlin' });
};
openReq.onsuccess = () => {
const db = openReq.result;
const index = db
.transaction('kunden', 'readonly')
.objectStore('kunden')
.index('nachStadt');
const req = index.getAllKeys('Berlin');
req.onsuccess = () => console.log(req.result);
req.onerror = () => console.error(req.error);
};
Promise-Wrapper mit Schlüsselbereich und Limit
const requestToPromise = (req) =>
new Promise((resolve, reject) => {
req.onsuccess = () => resolve(req.result);
req.onerror = () => reject(req.error);
});
// Die ersten 10 Bestellungen ab dem 1. Januar 2024 (Index auf 'datum')
const ersteBestellungen = async (db) => {
const index = db
.transaction('bestellungen', 'readonly')
.objectStore('bestellungen')
.index('nachDatum');
const bereich = IDBKeyRange.lowerBound(new Date('2024-01-01'));
return requestToPromise(index.getAllKeys(bereich, 10));
};
// Aufruf (db ist eine geöffnete IDBDatabase):
// const ids = await ersteBestellungen(db);
// console.log(ids);
Alle Datensätze mit einem bestimmten Status löschen
const loescheErledigte = (db) =>
new Promise((resolve, reject) => {
const tx = db.transaction('aufgaben', 'readwrite');
const store = tx.objectStore('aufgaben');
const req = store.index('nachStatus').getAllKeys('erledigt');
req.onsuccess = () => {
// Mit den Primärschlüsseln direkt im Store löschen
req.result.forEach((key) => store.delete(key));
};
tx.oncomplete = () => resolve(req.result.length);
tx.onerror = () => reject(tx.error);
});
// const anzahl = await loescheErledigte(db);
// console.log(`${anzahl} Aufgaben gelöscht`);
// Wichtig · Fallstricke
- Primär- statt Indexschlüssel: Zurückgegeben werden die Primärschlüssel des Object Stores, nicht die Werte des Index. Die Indexschlüssel selbst erhalten Sie über
openKeyCursor()mitcursor.key. - Ausnahmen:
TransactionInactiveError, wenn die Transaktion schon beendet ist (etwa nach einemawaitauf etwas anderes als IndexedDB-Anfragen).InvalidStateError, wenn der Index oder sein Store gelöscht wurde.DataErrorbei einem ungültigen Schlüssel oder Bereich.TypeErrorbei ungültigemcount. - Speicher: Ohne
countlanden alle Treffer auf einmal im Speicher. Bei sehr großen Indizes laden Sie deshalb besser seitenweise (Bereich ab dem letzten Schlüssel) oder verwenden einen Cursor. - multiEntry-Indizes: Ein Datensatz mit mehreren passenden Array-Werten kann mehrfach im Ergebnis auftauchen, falls der Bereich mehrere seiner Indexschlüssel umfasst.
- Kompatibilität: Wird von allen aktuellen Browsern unterstützt (Chrome 48+, Firefox 44+, Safari 10.1+, Edge 79+). Neuere Entwürfe der Spezifikation erlauben zusätzlich ein Optionsobjekt (u. a. mit
direction); das wird aber noch nicht flächendeckend unterstützt.