Javascript: поиск indexeddb с использованием нескольких индексов

Я хочу изменить с WebSql на Indexeddb. Однако, как бы делать SQL-запросы, такие как

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

с индексомDB? Например, я заметил при чтении документации indexedDb, что все примеры запрашивают только один индекс в то время. Таким образом, вы можете сделать

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

Но мне нужно запросить сразу несколько индексов!

Я также нашел несколько интересных сообщений о составных индексах, но они работают, только если вы запрашиваете все поля в составном индексе.

Ответ 1

В вашем примере составной индекс все еще работает, но для него требуются два составных индекса

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

И запрос вроде этого

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

Индексы могут быть упорядочены в любом порядке, но наиболее эффективны, если в первую очередь появляются самые конкретные.

В качестве альтернативы вы также можете использовать соединение с ключом. Для объединения ключей требуются четыре (одиночных) индекса. Четыре индекса занимают меньше места для хранения и более общие. Например, для следующего запроса требуется другой составной индекс

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

Ключ к работе по-прежнему работает для этого запроса.