Javascript:使用多个索引搜索indexeddb

Javascript: Searching indexeddb using multiple indexes

本文关键字:索引 搜索 indexeddb Javascript      更新时间:2023-09-26

我想从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

with IndexedDB ?例如,我在阅读indexedDb的文档时注意到,所有的示例一次只查询一个索引。所以你可以输入

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

但是我需要同时查询多个索引!

我也发现了一些关于复合索引的有趣帖子,但它们只有在你查询复合索引中的所有字段时才能工作。

对于您的示例,复合索引仍然有效,但需要两个复合索引

 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

键连接对该查询仍然有效。