【问题标题】:An efficient way of removing objects from an indexedDB object store that are missing a property从 indexedDB 对象存储中删除缺少属性的对象的有效方法
【发布时间】:2016-11-17 18:05:41
【问题描述】:

我正在考虑如何让我的项目中的某个操作更高效。当前实现中的操作从对象存储中加载所有对象,遍历数组并测试对象是否缺少属性或属性是否未定义,将此类对象的集合收集到第二个数组中,然后删除所有这些对象。

我已经在使用 getAll 了,因为它明显优于光标迭代。

我同时调用单个删除请求,因此没有加快速度,但 indexedDB api 不断发展以支持对缺少值的非索引非 keypath 道具进行批量删除。

问题是当属性不在对象存储的键路径中时,如果没有将每个对象完全加载到内存中,我无法检查该属性。在某些情况下,对象相当大。有时每个对象的其中一个属性非常大(本质上是一个 html 文档的字符串)。

我不能使用索引,因为对象中不存在或没有值的属性不会出现在索引中。

有没有办法避免将此类对象加载到内存中?

我考虑过分区,并使用两个对象存储,一个用于可查询的道具,一个用于完整数据。但这会演变为每次读取都必须执行额外的请求。我的应用比这个偶尔的批量删除操作做了更多的阅读。

我曾考虑为每个对象存储一个额外的属性,该属性始终具有像 myObject.doesOtherPropertyHaveValue 这样包含 0/1 的值,因此是可索引的,但这似乎也不是很好。当然我可以只通过这个索引进行查询并使用 getAllKeys 并解决问题。但是,现在每个 add/put 都必须维护这个函数依赖。

感谢任何建议。

【问题讨论】:

    标签: javascript indexeddb


    【解决方案1】:

    如果记录的格式为 {key, prop},其中 prop 可能不存在,您可以在 [key, prop] 上创建索引。只有存在 prop 时才会有索引记录。然后打开两个仅键游标:一个在商店 (C1) 上,一个在索引 (C2) 上。检查 C1.primaryKey 是否等于 C2.primaryKey[0]。如果是这样,则道具存在,请同时推进。如果键 不 相等,则 C1 指向没有道具的记录;删除它并推进C1。重复。 (当你到达范围的末端时要注意边缘情况。)

    这有两个问题:(1)您仍在使用游标,因此仍需支付往返费用(与 getAll() 不同),以及(2)如果 prop 很大(即 HTML 文档的正文为你提到)那么即使只是使用键光标,你仍然在移动大量数据。

    (未来我们希望通过添加 more general query mechanism 或 custom indexing 可能与 delete-on-index 结合来解决这个问题 - 两者都可以让这更容易和更高效)

    ...在第二个数组中收集这些对象的集合,然后删除所有这些对象...

    如果您坚持这种方法,请记住您可以在找到delete() 呼叫时发出它们;无需收集所有对象,也无需等待删除完成;您可以以“即发即弃”的方式使用 IDB 进行写操作。

    【讨论】:

    • 谢谢乔希。我想要删除索引内容,因为我本质上想要DELETE FROM objectStore WHERE prop not in obj or obj.prop = null or obj.prop = undefined;,其中数据甚至没有加载到js中。我对火而忘记方面的一个问题是我非常喜欢语法await Promise.all(deleteRequestPromises); 而不是Promise.all(deletes).catch()。当然,如果我在索引上删除了,我就不需要这个了,但我只是想补充一点关于它当前的工作方式。
    【解决方案2】:

    您走在正确的道路上,非规范化可能是提高性能所必需的。从 indexedDB 文档中,不幸的是,没有办法查询您需要的方式。

    如果真正的瓶颈是 I/O 或将数据编组到 JS 领域,那么也许尝试在写入之前压缩数据,并在您真正需要对其进行处理时解压缩? GZIP 可以很好地压缩文本,有时最多可压缩 70%。有一些适用于 JS 的 GZIP 库可以工作:

    https://github.com/nodeca/pako

    但是,一如既往地进行基准测试!

    【讨论】:

      猜你喜欢
      • 2021-09-08
      • 2021-09-11
      • 2015-07-17
      • 1970-01-01
      • 2023-01-07
      • 2011-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多