Start · Sprachen · JavaScript · Referenz · IDBIndex.multiEntry

IDBIndex.multiEntry

Eigenschaft

Schreibgeschützter boolescher Wert. Er gibt an, ob der Index für jedes Element eines Array-Schlüssels einen eigenen Eintrag anlegt (<code>true</code>) oder das ganze Array als einen Schlüssel behandelt.

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

Signatur

IDBIndex.multiEntry

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

Typ
boolean
Beschreibung
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);
};
true false

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));
};
true ["Promises"]

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}`);
  }
};
nachTag: keyPath=tags, multiEntry=true, unique=false

// Wichtig · Fallstricke

  • Die Eigenschaft ist schreibgeschützt. Wer das Verhalten ändern will, muss den Index in einem versionchange-Upgrade mit deleteIndex() löschen und mit der neuen Option wieder anlegen.
  • Ist der keyPath selbst ein Array (zusammengesetzter Schlüssel), darf multiEntry nicht true sein. Sonst wirft createIndex() einen InvalidAccessError.
  • Bei multiEntry: true werden doppelte Werte innerhalb desselben Arrays nur einmal indiziert. Array-Elemente, die keine gültigen Schlüssel sind (z. B. Objekte oder null), werden übersprungen.
  • In Kombination mit unique: true darf ein einzelnes Array-Element in keinem anderen Datensatz vorkommen. Sonst schlägt das Schreiben mit einem ConstraintError fehl.
  • 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 multiEntry nicht.