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

IDBIndex.getAllKeys()

Methode

Ruft asynchron die Primärschlüssel aller Datensätze eines Index ab, optional gefiltert nach Indexschlüssel bzw. <code>IDBKeyRange</code> und begrenzt durch <code>count</code>.

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

Signatur

IDBIndex.prototype.getAllKeys(query, count)

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

Typ
IDBRequest<IDBValidKey[]>
Beschreibung
Ein 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);
};
[1, 3]

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);
z. B. [17, 18, 21, 25, …] (höchstens 10 Einträge)

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`);
z. B. "4 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() mit cursor.key.
  • Ausnahmen: TransactionInactiveError, wenn die Transaktion schon beendet ist (etwa nach einem await auf etwas anderes als IndexedDB-Anfragen). InvalidStateError, wenn der Index oder sein Store gelöscht wurde. DataError bei einem ungültigen Schlüssel oder Bereich. TypeError bei ungültigem count.
  • Speicher: Ohne count landen 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.