可以安全地在索引中采用与存储相同的顺序,键的上部相同吗?

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