web-dev-qa-db-ja.com

Javascript:複数のインデックスを使用してindexeddbを検索する

WebSqlからIndexeddbに変更したい。ただし、次のようなSQLクエリをどのように実行しますか

SELECT * FROM customers WHERE ssn = '444-44-4444' and emal = 'bill@[email protected]'
SELECT * FROM customers WHERE ssn = '444-44-4444' and emal = 'bill@[email protected]' and age = 30
SELECT * FROM customers WHERE ssn = '444-44-4444' and emal = 'bill@[email protected]' and name = 'Bill'
etc

indexedDBを使用しますか?たとえば、indexedDbの documentation を読んでいるときに、すべての例で一度に1つのインデックスしかクエリされないことに気付きました。だからあなたはすることができます

var index = objectStore.index("ssn");
index.get("444-44-4444").onsuccess = function(event) {
     alert("Name is " + event.target.result.name);
};

しかし、同時に複数のインデックスをクエリする必要があります!

複合インデックス に関する興味深い投稿もいくつか見つかりましたが、複合インデックスのすべてのフィールドをクエリした場合にのみ機能します。

17

あなたの例では、複合インデックスは引き続き機能しますが、2つの複合インデックスが必要です

 objectStore.createIndex('ssn, email, age', ['ssn', 'email', 'age']); // corrected
 objectStore.createIndex('ssn, email, name', ['ssn', 'email', 'name'])

そして、このようなクエリ

 keyRange = IDBKeyRange.bound(
     ['444-44-4444', 'bill@[email protected]'],
     ['444-44-4444', 'bill@[email protected]', '']) 
 objectStore.index('ssn, email, age').get(keyRange)
 objectStore.index('ssn, email, age').get(['444-44-4444', 'bill@[email protected]', 30])
 objectStore.index('ssn, email, name').get(['444-44-4444', 'bill@[email protected]', 'Bill'])

インデックスは任意の順序で配置できますが、最も具体的なものが最初に来ると最も効率的です。

または、 キー結合 を使用することもできます。キー結合には、4つの(単一の)インデックスが必要です。 4つのインデックスは、より少ないストレージスペースとより一般的なものを使用します。たとえば、次のクエリには別の複合インデックスが必要です

SELECT * FROM customers WHERE ssn = '444-44-4444' and name = 'Bill' and age = 30

キー結合は、そのクエリでも引き続き機能します。

18
Kyaw Tun