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

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

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

С технологии IndexedDB ? Например, я заметил, читая документация 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', 'bill@bill@company.com'],
     ['444-44-4444', 'bill@bill@company.com', '']) 
 objectStore.index('ssn, email, age').get(keyRange)
 objectStore.index('ssn, email, age').get(['444-44-4444', 'bill@bill@company.com', 30])
 objectStore.index('ssn, email, name').get(['444-44-4444', 'bill@bill@company.com', 'Bill'])

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

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

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

соединение клавиш все еще работает для этого запроса.