因此,我在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);
答案 0 :(得分:2)
键顺序在这里定义:
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)