2013-05-11 4 views
11

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

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? Например, я заметил при чтении documentation indexedDb, что все примеры запрашивают только один индекс в то время. Поэтому вы можете сделать

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

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

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

+1

Возможный дубликат [In IndexedDB, есть способ сделать отсортированный составной запрос?] (Http://stackoverflow.com/questions/12084177/in-indexeddb-is-there-a-way-to-make -a-sorted-complex-query) – Josh

ответ

15

Для примера, составной индекс по-прежнему работает, но требует двух составных индексов

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']) 

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

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

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

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

+0

спасибо большое! Однако я все еще не могу запросить использование двух индексов. Я создал [http://jsfiddle.net/jeanluca/sDeGz/](jsfiddle), чтобы продемонстрировать эту проблему! Мне также пришлось изменить свой параметр objectStore.index в objectStore.index ('ssn', 'email', 'age'), иначе я получил исключение «DOM IDBDatabase Exception 8». –

+0

извините, я вижу, что ссылка неверна: http://jsfiddle.net/jeanluca/sDeGz/ –

+0

Извините, я скорректировал 'index' на' createIndex'. ошибка не должна выдаваться. но обратите внимание, что IE10 не поддерживает составной индекс. –

Смежные вопросы