javascript - 优化 IndexedDB 查询

标签 javascript nosql indexeddb dexie

我正在使用 Dexie.JS 来处理 IndexedDB。 目前,有一个愚蠢的查询写为:

return db.events.each((element) => {
  let d = element.cause.data;
  if (d.hasOwnProperty('deleted') && (false == d.deleted) &&
      d.hasOwnProperty('abbreviation') &&
      d.hasOwnProperty('contents') && (d.abbreviation == key)) {
    snippet = d.contents;
  }
}).then(() => {
  return snippet;
});

它工作正常,但在大型数据库上速度慢得像糖蜜。我应该在由 db.events 组成的集合上运行每个集合并应用 where 吗?这会提高性能吗?

谢谢

最佳答案

是的,如果假设您的“key”变量是可索引类型:字符串、数字、日期、TypedArray 或数组,您可以像这样优化查询:

首先,确保在 db.events 上添加索引“cause.data.abbreviation”:

db.version(2).stores({
  events: 'yourPrimaryKey, cause.data.abbreviation'
});

然后,像这样重写查询:

return db.events
  // Let indexedDB sort out all items matching given key:
  .where('cause.data.abbreviation').equals(key)
  // Filter the rest manually using Collection.filter():
  .filter(element => {
    let d = element.cause.data;
    return (d.hasOwnProperty('deleted') && (false == d.deleted) &&
      d.hasOwnProperty('contents'));
  })
  // Execute the query and only return the first match:
  .first();

关于javascript - 优化 IndexedDB 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46431344/

相关文章:

javascript - 了解 alert() 如何影响浏览器事件循环

javascript - 我应该在 JavaScript 中的什么位置放置搜索功能?

c# - ORM 与 NoSQL API 是多余的吗?

javascript - 如何在indexeddb中仅添加一次初始数据

javascript - 清除javascript或angular中的轮询超时

database - 如何在 Clusterpoint DB 中搜索全文匹配?

python - 如何将 AWS 的 Dynamo Db 与 Django 结合使用?

javascript - Indexeddb 缓慢检索问题

indexeddb - IDBDatabase.transaction 中不推荐使用数字事务模式。使用 "readonly"或 "readwrite"

javascript - 将正文作为 JSON 传递时,Lumen API 返回 422 错误