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

IDBIndex.getAll()

Methode

Ruft alle Datensätze eines Index ab, die zu einem Schlüssel oder <code>IDBKeyRange</code> passen, optional begrenzt auf eine Höchstanzahl, sortiert nach dem Indexschlüssel.

seit JavaScript Baseline: alle modernen Browser (seit 2016/2017) Kategorie: webapi

Signatur

IDBIndex.prototype.getAll(query, count)

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

Typ
IDBRequest<any[]>
Beschreibung
Ein 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);
};
["Anna", "Clara"]

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`);
z. B. "10 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 count nutzen, seitenweise laden oder openCursor() verwenden.
  • Nur aufsteigend: getAll() kennt keine Richtung. Für absteigende Reihenfolge das Array mit reverse() umdrehen oder einen Cursor mit 'prev' verwenden.
  • Ausnahmen: TransactionInactiveError, wenn die Transaktion schon beendet ist (etwa nach einem await auf etwas anderes als IndexedDB-Requests), InvalidStateError, wenn der Index gelöscht wurde, DataError bei ungültigem Schlüssel und TypeError bei ungültigem count.
  • 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.