使用类似SQL的IndexedDB。具有不在范围内的多个索引值的查询。

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (108)

基本上我想选择与索引/键匹配的所有值,但它们不是以编程方式在范围内。它必须能够选择一系列请求(一次可变量)。在SQL中我会这样做。

Select * FROM questions WHERE `id` in (2,45,17)

但当它成为indexedDB时,我的选择似乎有限。我发现我可以连续发出多个请求,但是如果不知道有多少人会在手边被选中,我该怎么办呢?

这是我正在使用的当前JavaScript。显然这不起作用。我已经创建了一个名为“practice_materials”的indexedDB数据库,创建了一个名为“questions”的对象库,通过id创建了索引,并将数据放入其中。

window.idb=window.indexedDB;
     var request=indexedDB.open(db_name,db_version);
request.onerror=function(event){
    console.log('error:'+event);
}
request.onsuccess=function(event){
  db_res=request.result;
}
var tx=db_res.transaction([obj_store]).objectStore(obj_store);
var res='';     
var out_obj=[];
var id=[2,45,17];
for(i=0;i<3;++i){
    request=tx.get(id[i]);
    request.onsuccess=function(event){
    out_obj.push(request.result);
    }
}

PS我将把它用作问答系统,作为解剖学生的学习辅助工具。它将从每一章(我已经制作)中选择一个随机数量的问题,范围将是15-25,随机选择问题。我会利用WebSQL,因为我可以更容易地做到这一点,但它已被赞赏。

PPS除了+ Rep以获得正确答案之外,我还会包含一个返回此问题的链接。

提问于
用户回答回答于

没有直接路由来模拟SQL in语句。这是两个解决方案。

使用Array.prototype.filter() (有人可能认为两行代码非常简单)

const filter = [2,45,17];
const fieldToFilter = "someField";
objectStore.getAll().onsuccess = function(event) {
  const filtered = event.target.result.filter(i => filter.includes(i[fieldToFilter]));
  console.log(filtered);
};

使用IndexDB游标:

归因:改编自:此处

let i = 0;
const selected = [];
const filter = [2,17,45];

myIndex.openCursor(keyRangeValue).onsuccess = function(event) {
  let cursor = event.target.result;
  if (!cursor) { // We are done
    console.log(selected); // do something with result
    return;
  } 
  var key = cursor.key;
  if (key > filter[i]) { // filter should be sorted asc
    ++i;
    if (i >= filter.length) {
      return;
    }
  }
  if (key === filter[i]) { // Use individual row
    selected.push(cursor.value); // here
    cursor.continue(); // Next
  } else {
    cursor.continue(filter[i]); // Go to the next filtered key
  }
}

扫码关注云+社区

领取腾讯云代金券