Signatur
Beschreibung
getAll() gibt ein IDBRequest zurück, dessen result nach erfolgreichem Abschluss ein Array mit allen Werten (vollständigen Objekten) enthält, deren Indexschlüssel zum angegebenen Filter passen. Die Reihenfolge richtet sich nach dem Indexschlüssel, nicht nach dem Primärschlüssel des Object Stores.
Die Methode ist praktisch, wenn du mehrere Datensätze auf einmal brauchst, etwa „alle Kunden aus Berlin“ oder „alle Bestellungen eines Zeitraums“. Im Vergleich zu einem Cursor (openCursor()) ist getAll() meist deutlich schneller, weil nicht für jeden Datensatz ein eigenes success-Ereignis ausgelöst wird.
Ohne Argumente liefert die Methode sämtliche Einträge des Index. Mit query kannst du auf einen exakten Schlüssel oder einen Bereich (IDBKeyRange) einschränken, mit count die Ergebnismenge begrenzen. Brauchst du nur die Primärschlüssel, ist getAllKeys() sparsamer.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $query | any | IDBKeyRange | null | undefined (alle Einträge) | Ein gültiger Schlüssel oder ein IDBKeyRange, auf den gefiltert wird. null oder weglassen liefert alle Einträge. |
| $count | number | unbegrenzt | Höchstanzahl der zurückgegebenen Werte, ganze Zahl von 0 bis 232−1. 0 bedeutet ebenfalls unbegrenzt. |
Rückgabewert
IDBRequest. Im success-Ereignis steht in request.result ein Array der passenden Werte (bei keinem Treffer ein leeres Array).Beispiele
Alle Kunden einer Stadt abrufen
const openReq = indexedDB.open('shop', 1);
openReq.onupgradeneeded = () => {
const db = openReq.result;
const store = db.createObjectStore('kunden', { keyPath: 'id' });
store.createIndex('nachStadt', 'stadt');
store.put({ id: 1, name: 'Anna', stadt: 'Berlin' });
store.put({ id: 2, name: 'Ben', stadt: 'Hamburg' });
store.put({ 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.getAll('Berlin');
req.onsuccess = () => {
console.log(req.result.map((k) => k.name));
};
req.onerror = () => console.error(req.error);
};
Promise-Wrapper mit Bereich und Limit
const promisify = (req) => new Promise((resolve, reject) => {
req.onsuccess = () => resolve(req.result);
req.onerror = () => reject(req.error);
});
// Annahme: Store 'bestellungen' mit Index 'nachDatum' auf dem Feld 'datum' (ISO-String)
const neuesteBestellungen = async (db) => {
const index = db.transaction('bestellungen')
.objectStore('bestellungen')
.index('nachDatum');
const bereich = IDBKeyRange.bound('2024-01-01', '2024-12-31');
// höchstens 10 Bestellungen aus 2024, aufsteigend nach Datum
return promisify(index.getAll(bereich, 10));
};
const db = await promisify(indexedDB.open('shop', 2));
const liste = await neuesteBestellungen(db);
console.log(`${liste.length} Bestellungen gefunden`);
Alle Einträge ohne Filter
const alleNachName = (db) => new Promise((resolve, reject) => {
const req = db.transaction('kunden')
.objectStore('kunden')
.index('nachName')
.getAll(); // kein Filter → sortiert nach Name
req.onsuccess = () => resolve(req.result);
req.onerror = () => reject(req.error);
});
// Wichtig · Fallstricke
- Speicherbedarf: Alle Treffer landen gleichzeitig im Arbeitsspeicher. Bei sehr großen Datenmengen lieber
countnutzen, seitenweise laden oderopenCursor()verwenden. - Nur aufsteigend:
getAll()kennt keine Richtung. Für absteigende Reihenfolge das Array mitreverse()umdrehen oder einen Cursor mit'prev'verwenden. - Ausnahmen:
TransactionInactiveError, wenn die Transaktion schon beendet ist (etwa nach einemawaitauf etwas anderes als IndexedDB-Requests),InvalidStateError, wenn der Index gelöscht wurde,DataErrorbei ungültigem Schlüssel undTypeErrorbei ungültigemcount. - multiEntry-Indizes: Hier kann ein Datensatz mehrfach im Ergebnis stehen, wenn mehrere seiner Array-Werte zum Bereich passen.
- Kompatibilität: Wird von allen modernen Browsern unterstützt, auch in Web Workern. Sehr alte Browser (IE, Edge Legacy) kennen die Methode nicht. Neuere Spezifikationsentwürfe sehen außerdem eine Variante mit Optionsobjekt (
getAll({ query, count, direction })) vor, die aber noch nicht überall verfügbar ist.