Signatur
Beschreibung
Die Eigenschaft multiEntry eines IDBIndex zeigt an, wie sich der Index verhält, wenn die Auswertung seines Schlüsselpfads (keyPath) ein Array ergibt. Welcher Wert gilt, legt man beim Erstellen des Index mit IDBObjectStore.createIndex(name, keyPath, { multiEntry: true }) fest. Später lässt er sich nur noch auslesen.
true: Für jedes Element des Arrays kommt ein eigener Eintrag in den Index. So findet man einen Datensatz über jeden einzelnen Wert, etwa über ein einzelnes Tag.false(Standard): Das ganze Array wird als ein zusammengesetzter Schlüssel gespeichert. Eine Abfrage trifft dann nur, wenn das komplette Array übereinstimmt.
Typischer Einsatz sind Tag-, Kategorie- oder Schlagwortlisten. Ein Artikel mit tags: ["js", "web"] lässt sich über einen Index mit multiEntry: true sowohl mit "js" als auch mit "web" finden. Liest man die Eigenschaft aus, sieht man, wie ein bestehender Index konfiguriert ist, zum Beispiel bei Migrationen in onupgradeneeded.
Rückgabewert
true, wenn der Index für jedes Element eines Array-Schlüssels einen eigenen Eintrag erzeugt. Sonst false.Beispiele
Index mit multiEntry anlegen und Eigenschaft prüfen
const request = indexedDB.open('blog', 1);
request.onupgradeneeded = (event) => {
const db = event.target.result;
const store = db.createObjectStore('artikel', { keyPath: 'id' });
const tagIndex = store.createIndex('nachTag', 'tags', { multiEntry: true });
const titelIndex = store.createIndex('nachTitel', 'titel');
console.log(tagIndex.multiEntry);
console.log(titelIndex.multiEntry);
};
Datensätze über ein einzelnes Tag finden
const openDb = () => new Promise((resolve, reject) => {
const req = indexedDB.open('blog', 1);
req.onupgradeneeded = () => {
const store = req.result.createObjectStore('artikel', { keyPath: 'id' });
store.createIndex('nachTag', 'tags', { multiEntry: true });
};
req.onsuccess = () => resolve(req.result);
req.onerror = () => reject(req.error);
});
const db = await openDb();
const tx = db.transaction('artikel', 'readwrite');
const store = tx.objectStore('artikel');
store.put({ id: 1, titel: 'Promises', tags: ['js', 'async'] });
store.put({ id: 2, titel: 'Flexbox', tags: ['css', 'layout'] });
const index = store.index('nachTag');
const req = index.getAll('js');
req.onsuccess = () => {
console.log(index.multiEntry, req.result.map((a) => a.titel));
};
Konfiguration eines bestehenden Index auslesen
const req = indexedDB.open('blog');
req.onsuccess = () => {
const db = req.result;
const store = db.transaction('artikel').objectStore('artikel');
for (const name of store.indexNames) {
const idx = store.index(name);
console.log(`${name}: keyPath=${idx.keyPath}, multiEntry=${idx.multiEntry}, unique=${idx.unique}`);
}
};
// Wichtig · Fallstricke
- Die Eigenschaft ist schreibgeschützt. Wer das Verhalten ändern will, muss den Index in einem
versionchange-Upgrade mitdeleteIndex()löschen und mit der neuen Option wieder anlegen. - Ist der
keyPathselbst ein Array (zusammengesetzter Schlüssel), darfmultiEntrynichttruesein. Sonst wirftcreateIndex()einenInvalidAccessError. - Bei
multiEntry: truewerden doppelte Werte innerhalb desselben Arrays nur einmal indiziert. Array-Elemente, die keine gültigen Schlüssel sind (z. B. Objekte odernull), werden übersprungen. - In Kombination mit
unique: truedarf ein einzelnes Array-Element in keinem anderen Datensatz vorkommen. Sonst schlägt das Schreiben mit einemConstraintErrorfehl. - Eine Abfrage kann denselben Datensatz mehrfach liefern, wenn der Bereich mehrere seiner Array-Elemente abdeckt, etwa bei
IDBKeyRange.bound("a", "z"). Wer das nicht will, muss die Treffer selbst bereinigen, z. B. über den Primärschlüssel. - Browser-Kompatibilität: Alle aktuellen Browser unterstützen die Eigenschaft. Ältere Versionen von Internet Explorer und Edge (vor Chromium) unterstützten
multiEntrynicht.