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

IDBIndex.getAllRecords()

Methode

Liest mit einer einzigen Anfrage alle passenden Datensätze eines Index. Jeder Datensatz enthält Indexschlüssel, Primärschlüssel und Wert. Optional lassen sich Bereich, Anzahl und Richtung angeben.

seit JavaScript IndexedDB 3.0 – experimentell, bisher nur in Chrom Kategorie: webapi

Signatur

IDBIndex.prototype.getAllRecords(options)

Beschreibung

Die Methode getAllRecords() des IDBIndex-Interfaces liefert in einer einzigen Anfrage alle Datensätze eines Index. Jeder Eintrag im Ergebnis ist ein IDBRecord-Objekt mit drei Eigenschaften: key (der Indexschlüssel), primaryKey (der Primärschlüssel im zugehörigen Object Store) und value (der gespeicherte Wert).

Bisher musste man für diese Kombination entweder zwei getrennte Aufrufe von getAll() und getAllKeys() machen und die Ergebnisse zusammenführen, oder einen IDBCursor Eintrag für Eintrag durchlaufen. getAllRecords() vereint beides. Die Methode ist besonders nützlich, wenn man Daten seitenweise laden will: Über den Parameter direction lässt sich außerdem rückwärts lesen oder nur eindeutige Indexwerte abfragen. Mit getAll() ging das bisher nicht.

Wie alle IndexedDB-Operationen arbeitet die Methode asynchron und gibt ein IDBRequest zurück. Das Ergebnis steht im success-Ereignis unter request.result bereit. Der Aufruf muss innerhalb einer aktiven Transaktion (readonly oder readwrite) erfolgen.

Parameter

Name Typ Default Beschreibung
$options object {} Optionales Objekt, das festlegt, welche Datensätze abgefragt werden.
$options.query IDBKeyRange | any null Ein Indexschlüssel oder ein IDBKeyRange, auf den die Ergebnisse eingeschränkt werden. Bei null oder ohne Angabe werden alle Datensätze geliefert.
$options.count number unbegrenzt Höchstzahl der gelieferten Datensätze, als ganze Zahl von 0 bis 232−1. 0 oder keine Angabe heißt: keine Begrenzung.
$options.direction "next" | "nextunique" | "prev" | "prevunique" "next" Leserichtung, wie bei openCursor(). Mit prev wird absteigend gelesen. Mit den *unique-Varianten wird pro Indexschlüssel nur ein Datensatz geliefert.

Rückgabewert

Typ
IDBRequest<IDBRecord[]>
Beschreibung
Ein IDBRequest. Im Erfolgsfall enthält result ein Array von IDBRecord-Objekten mit den Eigenschaften key, primaryKey und value. Die Reihenfolge ergibt sich aus direction.

Beispiele

Alle Datensätze eines Index lesen

// Vorausgesetzt: Store "kunden" (keyPath "id") mit Index "nachStadt" (keyPath "stadt")
const tx = db.transaction('kunden', 'readonly');
const index = tx.objectStore('kunden').index('nachStadt');

const request = index.getAllRecords();
request.onsuccess = () => {
  for (const { key, primaryKey, value } of request.result) {
    console.log(`${key} → #${primaryKey}: ${value.name}`);
  }
};
request.onerror = () => console.error(request.error);
Berlin → #3: Anna Hamburg → #1: Ben München → #2: Clara

Neueste Einträge absteigend und begrenzt, mit Promise-Hülle

const requestToPromise = (req) => new Promise((resolve, reject) => {
  req.onsuccess = () => resolve(req.result);
  req.onerror = () => reject(req.error);
});

const neuesteBestellungen = async (db, anzahl = 5) => {
  const index = db.transaction('bestellungen')
    .objectStore('bestellungen')
    .index('nachDatum');

  const records = await requestToPromise(index.getAllRecords({
    direction: 'prev',
    count: anzahl
  }));
  return records.map(r => ({ id: r.primaryKey, datum: r.key, ...r.value }));
};

console.log(await neuesteBestellungen(db, 3));
[{ id: 42, datum: '2025-03-10', ... }, { id: 41, ... }, { id: 39, ... }]

Seitenweise laden mit Rückfallebene für ältere Browser

const ladeSeite = (index, abSchluessel, groesse) => {
  const query = abSchluessel == null
    ? null
    : IDBKeyRange.lowerBound(abSchluessel, true); // exklusiv

  if ('getAllRecords' in IDBIndex.prototype) {
    return new Promise((resolve, reject) => {
      const req = index.getAllRecords({ query, count: groesse });
      req.onsuccess = () => resolve(req.result);
      req.onerror = () => reject(req.error);
    });
  }

  // Rückfallebene: Cursor durchlaufen
  return new Promise((resolve, reject) => {
    const result = [];
    const req = index.openCursor(query);
    req.onsuccess = () => {
      const cursor = req.result;
      if (!cursor || result.length >= groesse) return resolve(result);
      result.push({ key: cursor.key, primaryKey: cursor.primaryKey, value: cursor.value });
      cursor.continue();
    };
    req.onerror = () => reject(req.error);
  });
};

// Wichtig · Fallstricke

  • Kompatibilität: Die Methode gehört zum Entwurf IndexedDB 3.0 und steht bisher nur in Chromium-Browsern bereit (Chrome/Edge ab etwa Version 141). Firefox und Safari unterstützen sie derzeit nicht. Prüfen Sie die Verfügbarkeit daher immer mit 'getAllRecords' in IDBIndex.prototype und sehen Sie einen Cursor als Rückfallebene vor.
  • Nicht mehrdeutige Schlüssel: Bei Indizes mit multiEntry: true oder mit Duplikaten kann derselbe Primärschlüssel mehrmals im Ergebnis auftauchen, nämlich einmal pro Indexeintrag. Filtern Sie Duplikate bei Bedarf über primaryKey heraus.
  • Speicherbedarf: Ohne count wird der gesamte Index auf einmal in den Arbeitsspeicher geladen. Bei großen Datenmengen sollten Sie seitenweise laden (count zusammen mit IDBKeyRange.lowerBound(letzterKey, true)).
  • Fehler: Die Methode wirft TransactionInactiveError, wenn die Transaktion schon beendet ist, InvalidStateError, wenn Index oder Store gelöscht wurden, und DataError bei einem ungültigen Schlüssel oder Bereich in query. Ein TypeError tritt auf, wenn count außerhalb des erlaubten Bereichs liegt.
  • Beim Seitenweise-Laden mit Duplikaten im Index reicht der Indexschlüssel allein als Fortsetzungspunkt nicht aus. Hier ist ein Cursor mit continuePrimaryKey() zuverlässiger.