Start · Sprachen · JavaScript · Referenz · IDBCursor.direction

IDBCursor.direction

Eigenschaft

Schreibgeschützter String, der die Durchlaufrichtung eines <code>IDBCursor</code> angibt: <code>"next"</code>, <code>"nextunique"</code>, <code>"prev"</code> oder <code>"prevunique"</code>.

seit JavaScript Baseline: alle Browser Kategorie: webapi

Signatur

IDBCursor.direction

Beschreibung

Die schreibgeschützte Eigenschaft direction des Interfaces IDBCursor gibt an, in welcher Richtung der Cursor die Datensätze durchläuft. Die Richtung legst du beim Öffnen des Cursors fest, und zwar über den zweiten Parameter von IDBObjectStore.openCursor(), IDBObjectStore.openKeyCursor(), IDBIndex.openCursor() oder IDBIndex.openKeyCursor(). Danach lässt sie sich nicht mehr ändern.

Mögliche Werte:

  • "next" (Standard): aufsteigend nach Schlüssel, Duplikate werden mitgeliefert.
  • "nextunique": aufsteigend. Bei gleichen Index-Schlüsseln wird nur der erste Datensatz (mit dem kleinsten Primärschlüssel) geliefert.
  • "prev": absteigend nach Schlüssel, Duplikate werden mitgeliefert.
  • "prevunique": absteigend. Bei gleichen Index-Schlüsseln wird nur ein Datensatz geliefert, ebenfalls der mit dem kleinsten Primärschlüssel.

Nützlich ist die Eigenschaft vor allem in allgemeinen Hilfsfunktionen, die einen Cursor übergeben bekommen und je nach Richtung anders arbeiten sollen, etwa beim Blättern, bei der Anzeige „neueste zuerst“ oder beim Protokollieren. Die unique-Varianten machen nur bei Indizes einen Unterschied, die nicht eindeutig sind. In einem Object Store sind die Primärschlüssel ohnehin eindeutig.

Rückgabewert

Typ
"next" | "nextunique" | "prev" | "prevunique"
Beschreibung
Ein String (Enum IDBCursorDirection) mit der Durchlaufrichtung, die beim Öffnen des Cursors festgelegt wurde.

Beispiele

Richtung eines Standard-Cursors auslesen

const request = indexedDB.open('shop', 1);

request.onupgradeneeded = () => {
  const db = request.result;
  const store = db.createObjectStore('produkte', { keyPath: 'id' });
  store.add({ id: 1, name: 'Tastatur' });
  store.add({ id: 2, name: 'Maus' });
};

request.onsuccess = () => {
  const db = request.result;
  const store = db.transaction('produkte').objectStore('produkte');

  store.openCursor().onsuccess = (event) => {
    const cursor = event.target.result;
    if (!cursor) return;
    console.log(cursor.direction, cursor.key, cursor.value.name);
    cursor.continue();
  };
};
next 1 Tastatur next 2 Maus

Neueste Einträge zuerst mit "prev"

const zeigeNeuesteZuerst = (db) => {
  const store = db.transaction('produkte').objectStore('produkte');

  store.openCursor(null, 'prev').onsuccess = (event) => {
    const cursor = event.target.result;
    if (!cursor) return;
    console.log(`${cursor.direction}: ${cursor.value.name}`);
    cursor.continue();
  };
};
prev: Maus prev: Tastatur

Doppelte Index-Werte mit "nextunique" überspringen

// Annahme: Index 'kategorie' auf dem Store 'produkte' (nicht eindeutig)
const listeKategorien = (db) => {
  const index = db.transaction('produkte').objectStore('produkte').index('kategorie');
  const kategorien = [];

  index.openKeyCursor(null, 'nextunique').onsuccess = (event) => {
    const cursor = event.target.result;
    if (!cursor) {
      console.log(kategorien);
      return;
    }
    // Generische Prüfung über direction
    if (cursor.direction.endsWith('unique')) {
      kategorien.push(cursor.key);
    }
    cursor.continue();
  };
};
["Eingabegeräte", "Monitore"]

// Wichtig · Fallstricke

Schreibgeschützt: Wenn du cursor.direction etwas zuweist, bleibt das wirkungslos (im Strict Mode gibt es einen TypeError). Für eine andere Richtung musst du einen neuen Cursor öffnen.

Ungültige Werte: Wenn du openCursor() einen unbekannten Richtungs-String übergibst, wird ein TypeError geworfen. Veraltete numerische Konstanten wie IDBCursor.NEXT (aus frühen Entwürfen der Spezifikation) funktionieren in aktuellen Browsern nicht mehr.

Unique-Varianten: "prevunique" liefert bei gleichen Index-Schlüsseln den Datensatz mit dem kleinsten Primärschlüssel, nicht den letzten. Das überrascht oft.

Kompatibilität: Wird in allen modernen Browsern unterstützt, auch in Web Workern. In Node.js gibt es IndexedDB nicht nativ, dafür braucht es zum Beispiel fake-indexeddb.