Signatur
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
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);
};
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}`);
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}`);
// Wichtig · Fallstricke
- Ausnahmen:
TransactionInactiveError, wenn die Transaktion bereits beendet ist (z. B. nach einemawaitauf etwas anderes als IndexedDB-Requests);DataErrorbei 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.resultdirekt nach dem Aufruf zu lesen, wirft einenInvalidStateError. - 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.