所以我在indexeddb 中有一个存储,其中包含一个组合的keyPath:[someKey, someSubKey]
。我在 someKey
上有一个索引。我正在寻找删除给定 someKey
的所有对象的最快方法。我尝试采用的方法是获取索引上的下子键和上子键,然后使用下子键和上子键之间的键范围在存储上删除。
这有效,至少在 Firefox 和 Chrome 中是这样。但它假设索引中的值顺序与存储中的值顺序相同。我想知道这是否是一个安全的假设?我认为可能是这样,因为存储和索引的关键路径共享第一个键,但找不到太多有关排序顺序的文档。我不想单独删除每条记录,因为可能有数千条记录。
下面的伪代码描述了该方法:
const someKeyRange = IDBKeyRange.only(givenSomeKey);
const lowerSubKey = index.openKeyCursor(someKeyRange, "next")
.primaryKey[1];
const upperSubKey = index.openKeyCursor(someKeyRange, "prev")
.primaryKey[1]; //1 to get subKey
const storeRange = IDBKeyRange.bound(
[givenSomeKey, lowerSubKey],
[givenSomeKey, upperSubKey]
);
store.delete(storeRange);
最佳答案
key 排序在这里定义:
https://w3c.github.io/IndexedDB/#key-construct
特别针对您的情况,使用数组键,它们是按成员排序的。即如果 A
<B
,则 [A, ...]
<[B, ...]
.
是的,如果您要删除范围 IDBKeyRange.bound([A], [B], false, true)
,则会删除 [A, ... ]
。 (这假设 A 和 B 之间没有值。遗憾的是,API 中没有前缀范围。 https://github.com/w3c/IndexedDB/issues/47 )
关于javascript - 可以安全地假设索引中的顺序与键的上部相同的存储相同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52111115/