Start · Sprachen · JavaScript · Referenz · IDBIndex.get()

IDBIndex.get()

Methode

Sucht über einen Index asynchron den ersten Datensatz im Objekt-Store, dessen Indexschlüssel zum angegebenen Schlüssel oder <code>IDBKeyRange</code> passt, und liefert ein <code>IDBRequest</code>.

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

Signatur

IDBIndex.prototype.get(key)

Beschreibung

Mit IDBIndex.get() suchen Sie Datensätze eines Objekt-Stores nicht über den Primärschlüssel, sondern über ein indiziertes Feld, zum Beispiel einen Kunden per E-Mail-Adresse. Die Methode gibt sofort ein IDBRequest zurück. Die Suche selbst läuft asynchron. Sobald sie fertig ist, feuert das success-Ereignis, und in request.result steht der vollständige Datensatz aus dem referenzierten Objekt-Store, nicht nur der Indexschlüssel.

Als Argument ist ein einzelner gültiger Schlüssel oder ein IDBKeyRange erlaubt. Passen mehrere Datensätze (bei einem nicht eindeutigen Index oder einem Bereich), bekommen Sie nur den ersten in Sortierreihenfolge des Indexschlüssels. Bei gleichen Indexschlüsseln entscheidet der Primärschlüssel. Für alle Treffer nutzen Sie getAll() oder einen Cursor mit openCursor().

Wird nichts gefunden, ist das kein Fehler: result ist dann undefined. Deshalb können Sie mit get() nicht unterscheiden, ob ein Datensatz fehlt oder ob sein Wert tatsächlich undefined ist. Wenn nur die Existenz zählt, nehmen Sie getKey() oder count().

Parameter

Name Typ Default Beschreibung
$key Pflicht any | IDBKeyRange Ein gültiger IndexedDB-Schlüssel (number, string, Date, ArrayBuffer/typisiertes Array oder Array daraus) oder ein IDBKeyRange, der mit den Indexschlüsseln verglichen wird.

Rückgabewert

Typ
IDBRequest
Beschreibung
Ein IDBRequest. Nach dem success-Ereignis enthält result den ersten passenden Datensatz (strukturiert geklont) oder undefined, wenn kein Treffer existiert.

Beispiele

Kunden per E-Mail-Index finden

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

openReq.onupgradeneeded = () => {
  const db = openReq.result;
  const store = db.createObjectStore('kunden', { keyPath: 'id', autoIncrement: true });
  store.createIndex('by_email', 'email', { unique: true });
  store.add({ name: 'Anna Berg', email: 'anna@example.com' });
};

openReq.onsuccess = () => {
  const db = openReq.result;
  const index = db.transaction('kunden', 'readonly')
    .objectStore('kunden')
    .index('by_email');

  const req = index.get('anna@example.com');
  req.onsuccess = () => console.log(req.result);
  req.onerror = () => console.error('Fehler:', req.error);
};
{ name: 'Anna Berg', email: 'anna@example.com', id: 1 }

Promise-Wrapper mit async/await

const promisify = (request) => new Promise((resolve, reject) => {
  request.onsuccess = () => resolve(request.result);
  request.onerror = () => reject(request.error);
});

const findeKundeNachEmail = async (db, email) => {
  const index = db.transaction('kunden').objectStore('kunden').index('by_email');
  const kunde = await promisify(index.get(email));
  return kunde ?? null; // undefined = kein Treffer
};

// Nutzung:
// const kunde = await findeKundeNachEmail(db, 'unbekannt@example.com');
// console.log(kunde);
null

Ersten Treffer in einem Bereich abfragen

// Index 'by_price' auf dem Feld 'preis' im Store 'produkte'
const guenstigstesProdukt = (db, minPreis) => new Promise((resolve, reject) => {
  const index = db.transaction('produkte').objectStore('produkte').index('by_price');
  // Liefert das Produkt mit dem kleinsten Preis >= minPreis
  const req = index.get(IDBKeyRange.lowerBound(minPreis));
  req.onsuccess = () => resolve(req.result);
  req.onerror = () => reject(req.error);
});

// const p = await guenstigstesProdukt(db, 10);
// console.log(p?.name, p?.preis);
Kabel 12.5

// Wichtig · Fallstricke

  • Nur der erste Treffer: Bei nicht eindeutigen Indizes (unique: false) oder Bereichen gibt get() genau einen Datensatz zurück. Für alle Treffer verwenden Sie getAll() oder openCursor().
  • Kein Treffer ist kein Fehler: result ist dann undefined, und es feuert kein error-Ereignis.
  • Ausnahmen, die synchron geworfen werden: DataError bei einem ungültigen Schlüssel (z. B. null, undefined, Objekte oder NaN), TransactionInactiveError, wenn die Transaktion schon beendet ist (etwa nach einem await auf etwas anderes als einen IDB-Request), und InvalidStateError, wenn Index oder Store gelöscht wurden.
  • Datensätze ohne Indexfeld tauchen im Index nicht auf und lassen sich über ihn daher nicht finden.
  • Das Ergebnis ist eine strukturierte Kopie. Änderungen daran landen erst mit put() in einer readwrite-Transaktion in der Datenbank.
  • Die Methode wird in allen modernen Browsern und in Web Workern unterstützt. IDBKeyRange als Argument gibt es seit IndexedDB 2.0. Im privaten Modus älterer Firefox- und Safari-Versionen war IndexedDB teilweise eingeschränkt.