Start · Sprachen · JavaScript · Referenz · IDBKeyRange.upperBound()

IDBKeyRange.upperBound()

Methode

Erstellt einen <code>IDBKeyRange</code>, der nur eine obere Grenze hat – also alle Schlüssel bis zu (optional ausschließlich) einem bestimmten Wert umfasst.

seit JavaScript Baseline: alle Browser (IndexedDB 1.0) Kategorie: webapi

Signatur

IDBKeyRange.upperBound(upper, open)

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));
100 false 100 true true false true

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));
  };
};
["Tasse", "Lampe"]

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();
  };
};
2 Lampe 1 Tasse

// Wichtig · Fallstricke

  • Ist upper kein gültiger Schlüssel (z. B. null, undefined, NaN, ein Objekt oder ein ungültiges Date), wirft die Methode eine DOMException vom Typ DataError.
  • 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.