Signatur
Beschreibung
IDBKeyRange.upperBound() ist eine statische Methode. Sie erzeugt einen Schlüsselbereich, der nach unten offen ist und nur nach oben begrenzt wird. Damit lassen sich in IndexedDB Abfragen wie „alle Einträge bis zu einem Datum“, „alle Preise bis 100 €“ oder „alle IDs kleiner als 500“ formulieren.
Den Bereich übergibt man an Methoden wie IDBObjectStore.getAll(), IDBIndex.openCursor(), count() oder delete(). Mit dem zweiten Parameter open legt man fest, ob der Grenzwert selbst dazugehört (false, Standard, entspricht <=) oder nicht (true, entspricht <).
Die Schlüssel werden nach den IndexedDB-Vergleichsregeln sortiert: Number < Date < String < ArrayBuffer/Binärdaten < Array. Eine obere Grenze vom Typ Zahl schließt deshalb keine Strings ein, eine Grenze vom Typ String dagegen alle Zahlen und Datumswerte.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $upper Pflicht | number|string|Date|ArrayBuffer|ArrayBufferView|Array | Die obere Grenze des Bereichs. Muss ein gültiger IndexedDB-Schlüssel sein. | |
| $open | boolean | false | Bei true wird der Grenzwert selbst ausgeschlossen (<), bei false eingeschlossen (<=). |
Beispiele
Bereich erzeugen und Eigenschaften prüfen
const inklusive = IDBKeyRange.upperBound(100);
const exklusive = IDBKeyRange.upperBound(100, true);
console.log(inklusive.upper, inklusive.upperOpen);
console.log(exklusive.upper, exklusive.upperOpen);
console.log(inklusive.includes(100), exklusive.includes(100));
console.log(exklusive.includes(-5));
Alle Produkte bis 50 € über einen Index abfragen
const request = indexedDB.open('shop', 1);
request.onupgradeneeded = () => {
const store = request.result.createObjectStore('produkte', { keyPath: 'id' });
store.createIndex('preis', 'preis');
store.put({ id: 1, name: 'Tasse', preis: 12 });
store.put({ id: 2, name: 'Lampe', preis: 50 });
store.put({ id: 3, name: 'Stuhl', preis: 89 });
};
request.onsuccess = () => {
const db = request.result;
const index = db.transaction('produkte').objectStore('produkte').index('preis');
const abfrage = index.getAll(IDBKeyRange.upperBound(50));
abfrage.onsuccess = () => {
console.log(abfrage.result.map((p) => p.name));
};
};
Alte Log-Einträge vor einem Stichtag löschen
const loescheAlteLogs = (db, stichtag) =>
new Promise((resolve, reject) => {
const tx = db.transaction('logs', 'readwrite');
// Schlüssel = Zeitstempel (Date); Stichtag selbst bleibt erhalten
tx.objectStore('logs').delete(IDBKeyRange.upperBound(stichtag, true));
tx.oncomplete = () => resolve();
tx.onerror = () => reject(tx.error);
});
// Nutzung:
// await loescheAlteLogs(db, new Date('2024-01-01'));
Absteigend mit Cursor iterieren
const zeigeBisId = (db, maxId) => {
const store = db.transaction('produkte').objectStore('produkte');
store.openCursor(IDBKeyRange.upperBound(maxId), 'prev').onsuccess = (e) => {
const cursor = e.target.result;
if (!cursor) return;
console.log(cursor.key, cursor.value.name);
cursor.continue();
};
};
// Wichtig · Fallstricke
- Ist
upperkein gültiger Schlüssel (z. B.null,undefined,NaN, ein Objekt oder ein ungültigesDate), wirft die Methode eineDOMExceptionvom TypDataError. - Wegen der typübergreifenden Sortierung umfasst
upperBound('m')auch alle Zahlen- und Datumsschlüssel. Gemischte Schlüsseltypen in einem Store führen deshalb leicht zu unerwarteten Ergebnissen. - Strings werden nach Code-Einheiten verglichen, nicht nach Sprache:
'Z'<'a', Umlaute stehen hinter'z'. - Soll es auch eine untere Grenze geben, nimmt man
IDBKeyRange.bound(). Zwei Bereiche lassen sich nicht kombinieren. - Wird von allen modernen Browsern unterstützt, auch in Web Workern. In privaten Fenstern kann IndexedDB eingeschränkt sein.