Javascript 像SQL一样使用IndexedDB。具有不在范围内的多个索引值的查询

Javascript 像SQL一样使用IndexedDB。具有不在范围内的多个索引值的查询,javascript,indexeddb,database-indexes,Javascript,Indexeddb,Database Indexes,基本上,我希望选择与索引/键匹配的所有值,但它们不在编程范围内。它必须能够选择一系列的请求(比如每次的请求量是可变的)。在SQL中,我会这样做 Select * FROM questions WHERE `id` in (2,45,17) 但在IndexedB方面,我的选择似乎有限。我发现我可以一系列地处理多个请求,但如果事先不知道要选择多少个,我该怎么做呢 下面是我正在使用的当前JavaScript。显然这不起作用。我已经创建了一个名为“practice_materials”的indexe

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

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

但在IndexedB方面,我的选择似乎有限。我发现我可以一系列地处理多个请求,但如果事先不知道要选择多少个,我该怎么做呢

下面是我正在使用的当前JavaScript。显然这不起作用。我已经创建了一个名为“practice_materials”的indexedDB数据库,创建了一个名为“questions”的objectstore,按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);
    }
}
window.idb=window.indexedDB;
var request=indexedDB.open(db\u名称,db\u版本);
request.onerror=函数(事件){
console.log('错误:'+事件);
}
request.onsuccess=函数(事件){
db_res=request.result;
}
var tx=数据库存储事务([obj_存储]).objectStore(obj_存储);
var-res='';
var out_obj=[];
变量id=[2,45,17];

对于(i=0;i而言,在
语句中模拟SQL
没有直接的途径

使用
Array.prototype.filter()
(有人可能会说两行代码相当简单)

const filter=[2,45,17];
const fieldToFilter=“someField”;
objectStore.getAll().onsuccess=函数(事件){
const filtered=event.target.result.filter(i=>filter.includes(i[fieldToFilter]);
console.log(过滤);
};
使用IndexDB游标:

归属:改编自:


你发布的第一个选项是我作为最后手段想到的,因为我不想为了得到一些随机索引而把整个数据库从磁盘上拉下来。第二个选项看起来是可行的。我只需要自己尝试一下,并确保它在我将此标记为已解决之前有效,但它已经被升级。我想我的搜索技能没有那么好就像以前一样好。游标和过滤都是一团乱麻。我真希望mozilla在决定淘汰WebSQL时考虑到sql的一些细节,因为这会让我的生活更轻松。我想处理它时会很乱,但没有更好的选择。我希望他们会想到这一点在设计阶段会更好。
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
  }
}