javascript - 像 SQL 一样使用 IndexedDB。使用不在范围内的多个索引值进行查询

标签 javascript indexeddb database-indexes

基本上我想选择与索引/键匹配的所有值,但它们不在编程范围内。它必须能够选择一系列请求(例如一次选择不同数量的请求)。在 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);
    }
}

对于 future 遇到这个问题的人。利用 idb 摆脱回调 hell ,这样您就可以让代码等到数据库/其他事务完成后再尝试访问它。

https://github.com/jakearchibald/idb

唯一的事情是你必须为你的浏览器构建它,这是值得的,有 promise 并能够等待事务完成。(主要是在打开数据库、获取索引、选择对象存储等时,设置数据的多少并不那么重要,但拥有它仍然很好。 附: 我将利用它作为问答系统作为解剖学学生的学习助手。它将从每章(我制作的)中随机选择数量的问题,范围为 15-25,问题是随机选择的。我会使用 WebSQL,因为我可能可以更轻松地做到这一点,但我们对此表示赞赏。

P.P.S。 除了正确答案的 +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 游标:

归属:改编自:Here

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
  }
}

关于javascript - 像 SQL 一样使用 IndexedDB。使用不在范围内的多个索引值进行查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56211131/

相关文章:

sql - 当索引扫描是更好的选择时,Postgres 不使用索引

javascript - 对 indexedDB 查询的结果进行排序

sql - Oracle 多列索引与单列索引

javascript - Javascript 中的文本突出显示

javascript - 如何在 JavaScript 中修复未定义的 "TypeError: Cannot read property ' 映射'?

local-storage - IndexedDB 在 Chrome 应用程序中的持久性如何

javascript - 为什么使用 indexedDB 时会看到 "Type Error: cursor is undefined"?

sql - 强制 Oracle DB 中表的行子集具有唯一性

javascript - 如何将 Visualforce 组件中的脚本中的值传递到其 Controller

javascript - 无需身份验证即可从 javascript 访问 Google Analytics API 数据