Signatur
Beschreibung
Die Eigenschaft upper eines IDBKeyRange-Objekts gibt den Schlüssel zurück, der den Bereich nach oben begrenzt. Das kann jeder gültige IndexedDB-Schlüssel sein, also number, string, Date, ArrayBuffer bzw. typisierte Arrays oder ein Array aus solchen Werten (zusammengesetzte Schlüssel).
Ob der Wert selbst noch zum Bereich gehört, legt die zugehörige Eigenschaft upperOpen fest: Bei false ist die Grenze eingeschlossen (<=), bei true ausgeschlossen (<).
Welchen Wert upper hat, hängt von der Fabrikmethode ab, mit der der Bereich erzeugt wurde:
IDBKeyRange.bound(lower, upper)– der übergebene obere Schlüssel.IDBKeyRange.upperBound(upper)– der übergebene Schlüssel.IDBKeyRange.only(value)– derselbe Wert wielower.IDBKeyRange.lowerBound(lower)–undefined, weil der Bereich nach oben offen ist.
Nützlich ist die Eigenschaft vor allem für Debugging, Logging oder generischen Code, der übergebene Bereiche prüft, z. B. um Paginierungsgrenzen anzuzeigen oder einen Bereich mit veränderten Grenzen neu aufzubauen.
Rückgabewert
undefined, wenn keine obere Grenze gesetzt ist (z. B. bei IDBKeyRange.lowerBound()).Beispiele
Obere Grenze verschiedener Bereiche auslesen
const range1 = IDBKeyRange.bound(10, 20);
const range2 = IDBKeyRange.upperBound('m', true);
const range3 = IDBKeyRange.only(42);
const range4 = IDBKeyRange.lowerBound(5);
console.log(range1.upper, range1.upperOpen);
console.log(range2.upper, range2.upperOpen);
console.log(range3.upper);
console.log(range4.upper);
Datensätze in einem Preisbereich abfragen und Grenzen protokollieren
const openDb = () => new Promise((resolve, reject) => {
const req = indexedDB.open('shop', 1);
req.onupgradeneeded = () => {
const store = req.result.createObjectStore('produkte', { keyPath: 'id' });
store.createIndex('preis', 'preis');
store.put({ id: 1, name: 'Tasse', preis: 8 });
store.put({ id: 2, name: 'Kanne', preis: 25 });
store.put({ id: 3, name: 'Mühle', preis: 60 });
};
req.onsuccess = () => resolve(req.result);
req.onerror = () => reject(req.error);
});
const findeImBereich = async (min, max) => {
const db = await openDb();
const range = IDBKeyRange.bound(min, max, false, true); // max ausgeschlossen
console.log(`Suche von ${range.lower} bis ${range.upperOpen ? 'unter' : 'einschließlich'} ${range.upper}`);
return new Promise((resolve, reject) => {
const req = db.transaction('produkte')
.objectStore('produkte')
.index('preis')
.getAll(range);
req.onsuccess = () => resolve(req.result.map((p) => p.name));
req.onerror = () => reject(req.error);
});
};
findeImBereich(5, 60).then((namen) => console.log(namen));
Bereich mit neuer oberer Grenze nachbauen (IDBKeyRange ist unveränderlich)
const erweitereOben = (range, neueObergrenze) => {
if (range.lower === undefined) {
return IDBKeyRange.upperBound(neueObergrenze, range.upperOpen);
}
return IDBKeyRange.bound(range.lower, neueObergrenze, range.lowerOpen, range.upperOpen);
};
const alt = IDBKeyRange.bound(new Date('2024-01-01'), new Date('2024-01-31'));
const neu = erweitereOben(alt, new Date('2024-02-29'));
console.log(neu.upper.toISOString().slice(0, 10));
// Wichtig · Fallstricke
- Schreibgeschützt: Eine Zuweisung wie
range.upper = 99wird still ignoriert (im Strict Mode gibt es einenTypeError). Wenn du andere Grenzen brauchst, erzeugst du einfach einen neuen Bereich. undefinedabfragen: Bei Bereichen auslowerBound()istuppergleichundefined. Prüfe das mit=== undefined, nicht über die Wahrheitswertigkeit, denn0oder''sind gültige Grenzen.- Kopien statt Referenzen: Bei
Date- oderArray-Schlüsseln liefertuppereinen umgewandelten Wert. Ein Vergleich mit===gegen das ursprüngliche Objekt ergibt deshalbfalse. Zum Vergleichen nimmst duindexedDB.cmp(). - Nicht mit
upperOpenverwechseln:upperliefert nur den Wert. Ob die Grenze eingeschlossen ist, zeigt alleinupperOpen. - Kompatibilität: Wird von allen modernen Browsern unterstützt und ist auch in Web Workern verfügbar. In Node.js gibt es IndexedDB nicht von Haus aus, dafür brauchst du z. B.
fake-indexeddb.