Start · Sprachen · JavaScript · Referenz · IDBKeyRange.upper

IDBKeyRange.upper

Eigenschaft

Schreibgeschützte Eigenschaft, die die obere Grenze eines <code>IDBKeyRange</code> zurückgibt oder <code>undefined</code>, wenn der Bereich nach oben offen ist.

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

Signatur

IDBKeyRange.prototype.upper

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 wie lower.
  • 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

Typ
any (gültiger IndexedDB-Schlüssel) | undefined
Beschreibung
Die obere Grenze des Schlüsselbereichs oder 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);
20 false m true 42 undefined

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));
Suche von 5 bis unter 60 ["Tasse", "Kanne"]

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));
2024-02-29

// Wichtig · Fallstricke

  • Schreibgeschützt: Eine Zuweisung wie range.upper = 99 wird still ignoriert (im Strict Mode gibt es einen TypeError). Wenn du andere Grenzen brauchst, erzeugst du einfach einen neuen Bereich.
  • undefined abfragen: Bei Bereichen aus lowerBound() ist upper gleich undefined. Prüfe das mit === undefined, nicht über die Wahrheitswertigkeit, denn 0 oder '' sind gültige Grenzen.
  • Kopien statt Referenzen: Bei Date- oder Array-Schlüsseln liefert upper einen umgewandelten Wert. Ein Vergleich mit === gegen das ursprüngliche Objekt ergibt deshalb false. Zum Vergleichen nimmst du indexedDB.cmp().
  • Nicht mit upperOpen verwechseln: upper liefert nur den Wert. Ob die Grenze eingeschlossen ist, zeigt allein upperOpen.
  • 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.