2013-05-11 60 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 

與IndexedDB的? 例如,我在閱讀indexedDb的documentation時注意到,所有示例僅在當時查詢一個索引。所以你可以做

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

但我需要同時查詢多個索引!

我也發現了一些有趣的職位約compound indexes,但他們只如果查詢的複合索引的所有字段工作。

+1

的可能重複的[在索引資料,有一種方法,使已排序的化合物查詢?(http://stackoverflow.com/questions/12084177/in-indexeddb-is-there-a-way-to-make -a-sorted-compound-query) – Josh 2014-05-22 19:15:45

回答

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」異常。 – 2013-05-12 10:49:59

+0

對不起,我看到該鏈接不正確:http://jsfiddle.net/jeanluca/sDeGz/ – 2013-05-12 11:16:51

+0

對不起,我已經改正'index'到'createIndex'。沒有錯誤應該問題。但請注意,IE10不支持複合索引。 – 2013-05-13 01:06:36

相關問題