JavaScript:使用多个索引搜索 indexedDB

27

我想从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个回答

34

就您的示例而言,复合索引仍然适用,但需要使用两个复合索引。

 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

键连接在该查询中仍然起作用。


抱歉,我已将“index”更正为“createIndex”。不应该出现错误。但请注意,IE10不支持复合索引。 - Kyaw Tun
1
好的,谢谢。那么如果我想在任意字段的组合上进行搜索,我必须为每个组合创建一个索引(“ssn”,“ssn,name”,“ssn,email”,“ssn,name,email”等)吗?创建索引的成本有多高?例如,如果我有一个具有20个索引的大型对象存储? - Jeanluca Scaljeri
1
如果您需要键范围查询,则必须进行索引。20个索引是合理的。但是请尽量避免爆炸性索引问题。https://developers.google.com/appengine/docs/python/datastore/indexes#Index_Limits - Kyaw Tun
同样并非直接相关,但值得注意的是在使用变量时确保传递正确的类型。如果存在疑虑,例如使用parseInt()或类似方法。 - Chris
3
如果我没记错的话,这个链接可能是“key joining”的正确链接:http://dev.yathit.com/ydn-db/doc/query/key-joining.html。 - stackprotector
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接