我想检索所有与传递的值匹配的值。这就像SQL中的IN运算符一样。
一种直接的方法是打开游标(光标在索引上打开)并循环遍历值以检查它是否与其中一个匹配,但它看起来效率低,因为它需要读取整个数据存储。
另一种方法可能是循环遍历所有必需的值并在它们上使用IDBObjectStore.get(),但后来我不确定它是否比上述方法更有效。
IDBKeyRange当然无法帮助,因为我想要IN给定的值,而不是一些下限和上限范围。
有什么想法吗?
答案 0 :(得分:0)
是的,理想情况下,您在该属性上有一个索引,您可以在索引上打开一个光标。但是,您不需要遍历整个商店 - 只需要您正在寻找的价值。
给出这样的架构:
store = db.createObjectStore('records');
store.createIndex('by_field1', 'field1'); // implicitly unique:false
你这样做:
function findValues(passed, callback) {
var tx = db.transaction('records');
var store = tx.objectStore('records');
var index = store.index('by_field1');
// accumulate matching records here
var results = [];
// asynchronously loop over the passed values
function nextValue() {
if (!passed.length) {
// all done!
callback(results);
return;
}
// open a cursor matching just the current value we're looking for
var value = results.shift();
var request = index.openCursor(IDBKeyRange.only(value));
request.onsuccess = function() {
var cursor = request.result;
if (!cursor) {
nextValue();
} else {
results.push(cursor.value);
cursor.continue();
}
};
}
nextValue();
}
通过为每个传递的值打开一个游标并将它们全部并行迭代,累积单独的结果集,然后在所有游标完成时组合它们,可以提高效率。