从Indexeddb获取特定ID

时间:2015-02-17 14:58:13

标签: javascript indexeddb

在我的项目中,我正在使用浏览器的索引数据库,我想从数据库中检索一些具有特定ID的对象。根据{{​​3}},您可以使用范围来获得所需的结果:

根据MDN:

// Only match "Donna"
var singleKeyRange = IDBKeyRange.only("Donna");

// Match anything past "Bill", including "Bill"
var lowerBoundKeyRange = IDBKeyRange.lowerBound("Bill");

// Match anything past "Bill", but don't include "Bill"
var lowerBoundOpenKeyRange = IDBKeyRange.lowerBound("Bill", true);

// Match anything up to, but not including, "Donna"
var upperBoundOpenKeyRange = IDBKeyRange.upperBound("Donna", true);

// Match anything between "Bill" and "Donna", but not including "Donna"
var boundKeyRange = IDBKeyRange.bound("Bill", "Donna", false, true);

// To use one of the key ranges, pass it in as the first argument of openCursor()/openKeyCursor()
index.openCursor(boundKeyRange).onsuccess = function(event) {
  var cursor = event.target.result;
  if (cursor) {
    // Do something with the matches.
    cursor.continue();
  }
};

但是,如果您希望通过单个请求获得一系列不按顺序且不连续的特定ID(例如:[91,819,34,24,501]),您会怎么做?

3 个答案:

答案 0 :(得分:3)

根据您的评论,听起来您希望像SELECT objects FROM objects WHERE object.id = 1 OR object.id = 2 OR object.id = 5那样执行单个查询(请求)。不幸的是,indexedDB无法进行OR样式查询(联合)。它只能进行AND样式查询(交叉点)。

如果您想要检索的各种ID是先验已知的,则有一种可能的解决方案。您可以简单地存储其他group-id属性,将相关的ID放入不同的组,然后按group-id进行查询。如果要检索的ID重叠(显示在多个组中),或者是变量(对象到组的成员资格从查询更改为查询),这显然不起作用。

答案 1 :(得分:2)

您无法通过单个请求执行此操作,但您可以并行启动多个请求:

=INDEX(B5:B11,MATCH(Today(),C4:C11,1))

请注意,请求需要按顺序执行,因此var keys = [91,819,34,24,501]; var results = []; keys.forEach(function(key) { store.get(key).onsuccess = function(e) { results.push(e.target.result); if (results.length === keys.length) { // you're done! } }; }); 数组的顺序将与results数组的顺序相匹配。如果未找到密钥,则相应的结果索引将包含keys

(索引数据库的功能请求直接支持此问题:https://github.com/w3c/IndexedDB/issues/19但还没有最终的API设计。)

答案 2 :(得分:0)

使用光标可以一键获取多个对象。

需要对键进行排序。

var keys = [91,819,34,24,501].sort(function(a, b) {
   return a - b;
});
var results = [];
var i = 0;
var cursorReq = store.openCursor();
cursorReq.onsuccess = function(e) {
   var c = e.target.result;
   if(!c) { return; /* done */ }
   while(c.key > keys[i]) {
      i++;
      if(i === keys.length) { return; /* done */ }
   }
   if(c.key === keys[i]) { // found
      results.push(cursor.value);
      c.continue();
   } else { c.continue(keys[i]); }
}