Signatur
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
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);
};
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);
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);
// Wichtig · Fallstricke
- Nur der erste Treffer: Bei nicht eindeutigen Indizes (
unique: false) oder Bereichen gibtget()genau einen Datensatz zurück. Für alle Treffer verwenden SiegetAll()oderopenCursor(). - Kein Treffer ist kein Fehler:
resultist dannundefined, und es feuert keinerror-Ereignis. - Ausnahmen, die synchron geworfen werden:
DataErrorbei einem ungültigen Schlüssel (z. B.null,undefined, Objekte oderNaN),TransactionInactiveError, wenn die Transaktion schon beendet ist (etwa nach einemawaitauf etwas anderes als einen IDB-Request), undInvalidStateError, 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 einerreadwrite-Transaktion in der Datenbank. - Die Methode wird in allen modernen Browsern und in Web Workern unterstützt.
IDBKeyRangeals Argument gibt es seit IndexedDB 2.0. Im privaten Modus älterer Firefox- und Safari-Versionen war IndexedDB teilweise eingeschränkt.