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

IDBIndex.count()

Methode

Zählt asynchron die Datensätze eines IndexedDB-Index, die zu einem Schlüssel oder <code>IDBKeyRange</code> passen, und liefert das Ergebnis über ein <code>IDBRequest</code>.

seit JavaScript Baseline: alle modernen Browser (IndexedDB 2.0) Kategorie: webapi

Signatur

IDBIndex.prototype.count(query)

Beschreibung

IDBIndex.count() ermittelt, wie viele Datensätze eines Object Stores über einen bestimmten Index gefunden werden. Die Methode arbeitet asynchron: Sie gibt sofort ein IDBRequest zurück, dessen result-Eigenschaft im success-Ereignis die Anzahl als Zahl enthält.

Ohne Argument werden alle Einträge des Index gezählt. Übergibst du einen einzelnen Schlüssel, werden nur Datensätze mit genau diesem Indexwert gezählt. Mit einem IDBKeyRange lassen sich Bereiche zählen, z. B. alle Nutzer mit einem Alter zwischen 18 und 30.

Das ist deutlich effizienter, als alle Datensätze per getAll() oder Cursor zu laden und dann die Länge zu bestimmen, denn es werden keine Werte in den Speicher übertragen. Typische Einsätze sind Paginierung („Seite 3 von 12“), Zähler-Badges oder Statistiken.

Beachte: Bei einem multiEntry-Index wird ein Datensatz für jeden passenden Array-Eintrag gezählt; ein Datensatz kann also mehrfach in die Zahl eingehen.

Parameter

Name Typ Default Beschreibung
$query any | IDBKeyRange undefined (alle Einträge) Ein gültiger Schlüssel oder ein IDBKeyRange, der festlegt, welche Indexwerte gezählt werden. Fehlt der Parameter oder ist er undefined/null, werden alle Einträge gezählt.

Rückgabewert

Typ
IDBRequest<number>
Beschreibung
Ein IDBRequest. Bei Erfolg enthält request.result die Anzahl der passenden Einträge als number.

Beispiele

Alle Einträge eines Index zählen

const openReq = indexedDB.open('shop', 1);

openReq.onupgradeneeded = () => {
  const db = openReq.result;
  const store = db.createObjectStore('produkte', { keyPath: 'id' });
  store.createIndex('kategorie', 'kategorie');
  store.add({ id: 1, name: 'Tastatur', kategorie: 'hardware' });
  store.add({ id: 2, name: 'Maus', kategorie: 'hardware' });
  store.add({ id: 3, name: 'Editor', kategorie: 'software' });
};

openReq.onsuccess = () => {
  const db = openReq.result;
  const index = db.transaction('produkte', 'readonly')
    .objectStore('produkte')
    .index('kategorie');

  const countReq = index.count();
  countReq.onsuccess = () => console.log(`Gesamt: ${countReq.result}`);
  countReq.onerror = () => console.error(countReq.error);
};
Gesamt: 3

Nur einen bestimmten Indexwert zählen

// db ist eine geöffnete IDBDatabase (siehe oben)
const index = db.transaction('produkte').objectStore('produkte').index('kategorie');
const req = index.count('hardware');
req.onsuccess = () => console.log(`Hardware-Artikel: ${req.result}`);
Hardware-Artikel: 2

Bereich zählen mit Promise-Wrapper und IDBKeyRange

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

const countAdults = async (db) => {
  const index = db.transaction('nutzer', 'readonly')
    .objectStore('nutzer')
    .index('alter');
  // 18 bis einschließlich 30
  const range = IDBKeyRange.bound(18, 30);
  return promisify(index.count(range));
};

// Nutzung:
// const anzahl = await countAdults(db);
// console.log(`Nutzer zwischen 18 und 30: ${anzahl}`);
Nutzer zwischen 18 und 30: 42

// Wichtig · Fallstricke

  • Ausnahmen: TransactionInactiveError, wenn die Transaktion bereits beendet ist (z. B. nach einem await auf etwas anderes als IndexedDB-Requests); DataError bei ungültigem Schlüssel/Bereich; InvalidStateError, wenn der Index oder Object Store gelöscht wurde.
  • Das Ergebnis steht erst im success-Ereignis zur Verfügung – request.result direkt nach dem Aufruf zu lesen, wirft einen InvalidStateError.
  • Bei multiEntry-Indizes kann die Anzahl größer sein als die Zahl der tatsächlichen Datensätze.
  • Zum Zählen nach Primärschlüssel nutze IDBObjectStore.count().
  • Kompatibilität: In allen modernen Browsern und in Web Workern verfügbar; in privaten Modi mancher Browser ist IndexedDB eingeschränkt.