IndexedDB - 检索给定值的数据

时间:2015-05-26 18:46:18

标签: indexeddb

我想检索所有与传递的值匹配的值。这就像SQL中的IN运算符一样。

一种直接的方法是打开游标(光标在索引上打开)并循环遍历值以检查它是否与其中一个匹配,但它看起来效率低,因为它需要读取整个数据存储。

另一种方法可能是循环遍历所有必需的值并在它们上使用IDBObjectStore.get(),但后来我不确定它是否比上述方法更有效。

IDBKeyRange当然无法帮助,因为我想要IN给定的值,而不是一些下限和上限范围。

有什么想法吗?

1 个答案:

答案 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();
}

通过为每个传递的值打开一个游标并将它们全部并行迭代,累积单独的结果集,然后在所有游标完成时组合它们,可以提高效率。