IDBIndex

IndexedDB APIIDBIndex インターフェイスは、データベース内のインデックスへの非同期アクセスを提供します。インデックスはオブジェクトストアの一種で、参照先オブジェクトストアと呼ばれる別のオブジェクトストア内のレコードを検索するためのものです。データを取り出すためにこのインターフェイスを使用します。

オブジェクトストア内のレコードは、主キーを使用して取り出すことも、インデックスを使用して取り出すこともできます。インデックスにより、オブジェクトストア内のレコードに格納されている主キー以外の値の性質を用いてオブジェクトストアからレコードを検索できるようになります。

インデックスは永続的なキー-値ストレージで、そのレコードの値の部分は参照先オブジェクトストア内のレコードのキーの部分になります。参照先オブジェクトストアでレコードが挿入・更新・削除されると、そのたびにインデックス内でもレコードが自動で作成されます。あるインデックス内のレコードはそれぞれ参照先オブジェクトストア内のレコード 1 個だけを指すことができますが、複数のインデックスが同じオブジェクトストアを参照することができます。オブジェクトストアが変更されると、そのオブジェクトストアを参照する全てのインデックスが自動で更新されます。

ある範囲に含まれるキーの集合を得ることができます。詳しくは、IDBKeyRange を参照してください。

メモ: この機能はウェブワーカー内で利用可能です。

インスタンスプロパティ

IDBIndex.isAutoLocale 読取専用 非標準 Experimental

インデックスの作成時に locale の値が auto に設定されたかを表す boolean 値を返します。(createIndex() の引数 options を参照してください)

IDBIndex.locale 読取専用 非標準 Experimental

作成時に locale の値が指定されていれば、インデックスのロケール (たとえば en-USpl) を返します。(createIndex() の引数 options を参照してください)

IDBIndex.name

このインデックスの名前です。

IDBIndex.objectStore 読取専用

このインデックスが参照するオブジェクトストアの名前です。

IDBIndex.keyPath 読取専用

このインデックスのキーパスです。null である場合は、このインデックスは自動で作成されません。

IDBIndex.multiEntry 読取専用

インデックスのキーパスを評価した結果が配列になったとき、インデックスがどのようにふるまうかを変更します。true の場合は、インデックスにキーの配列内の各アイテムに対応するレコードをそれぞれ作成します。false の場合は、配列であるキーに対応するレコード 1 個を作成します。

IDBIndex.unique 読取専用

true の場合は、このインデックスはあるキーに対応する値の重複を許しません。

インスタンスメソッド

EventTarget から継承します。

IDBIndex.count()

IDBRequest オブジェクトを返し、別のスレッドでキーの範囲に含まれるレコードの数を返します。

IDBIndex.get()

IDBRequest オブジェクトを返し、別のスレッドで参照先オブジェクトストア内の指定されたキーに対応する値、もしくは keyIDBKeyRange のときは対応する最初の値を検索します。

IDBIndex.getKey()

IDBRequest オブジェクトを返し、指定されたキーに対応する主キー、もしくは keyIDBKeyRange のときは対応する最初の主キーを別のスレッドで検索します。

IDBIndex.getAll()

IDBRequest オブジェクトを返し、指定されたキー、もしくは keyIDBKeyRange の場合はキーの範囲に対応する参照先オブジェクトストア内の全ての値を別のスレッドで検索します。

IDBIndex.getAllKeys()

IDBRequest オブジェクトを返し、指定されたキー、もしくは keyIDBKeyRange の場合はキーの範囲に対応する参照先オブジェクトストア内の全てのキーを別のスレッドで検索します。

IDBIndex.openCursor()

IDBRequest オブジェクトを返し、指定されたキーの範囲を走査するためのカーソルを別のスレッドで作成します。

IDBIndex.openKeyCursor()

IDBRequest オブジェクトを返し、指定されたキーの範囲をこのインデックスの順番で走査するためのカーソルを別のスレッドで作成します。

以下の例では、トランザクションとオブジェクトストアを開き、シンプルな連絡先データベースからインデックス lName を取得します。そして、IDBIndex.openCursor を用いてそのインデックスで基本的なカーソルを開きます。これは、返されるレコードが主キーではなくこのインデックスによりソートされること以外、IDBObjectStore.openCursor を用いて ObjectStore で直接カーソルを開いたときと同じように動作します。

最後に、レコードを走査し、データを HTML テーブルに追加します。動く例全体は、IndexedDB-examples demo レポジトリを参照してください。(動く例を見る)

js
function displayDataByIndex() {
  tableEntry.innerHTML = "";
  const transaction = db.transaction(["contactsList"], "readonly");
  const objectStore = transaction.objectStore("contactsList");

  const myIndex = objectStore.index("lName");
  myIndex.openCursor().onsuccess = (event) => {
    const cursor = event.target.result;
    if (cursor) {
      const tableRow = document.createElement("tr");
      tableRow.innerHTML =
        `<td>${cursor.value.id}</td>` +
        `<td>${cursor.value.lName}</td>` +
        `<td>${cursor.value.fName}</td>` +
        `<td>${cursor.value.jTitle}</td>` +
        `<td>${cursor.value.company}</td>` +
        `<td>${cursor.value.eMail}</td>` +
        `<td>${cursor.value.phone}</td>` +
        `<td>${cursor.value.age}</td>`;
      tableEntry.appendChild(tableRow);

      cursor.continue();
    } else {
      console.log("全エントリーを表示しました。");
    }
  };
}

仕様書

Specification
Indexed Database API 3.0
# index-interface

ブラウザーの互換性

BCD tables only load in the browser

関連情報