可以安全地在索引中采用与存储相同的顺序,键的上部相同吗?
Safe to assume same order in index as store with upper part of key same?
所以我在 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);
此处定义键顺序:
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)
所以我在 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);
此处定义键顺序:
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)