删除indexedDB对象存储中所有记录的特定索引值

时间:2019-04-30 19:58:52

标签: javascript indexeddb

对于具有[a,b]且数组索引为a的索引的对象存储,是否有比删除a特定值的所有记录更有效的方法在索引a上的光标,并在光标中逐步删除每个记录?

有没有一种方法可以只为索引定义键范围,或者仅在a上定义键范围,而使b保持任意值开放,从而可以删除该键范围的所有记录?

在这种特定情况下,a是一个排除零的正整数,而b是一个包含零的正整数。是否可以保证从[n,0]到[n + 1,0]的键范围返回等于索引a=n的所有键,而不管b的值如何?例如,IDBKeyRange.bound([2,0],[3,0],false,true)将返回索引a=2的所有键?

以上键范围适用于我的测试用例,但是我想知道如果b不是整数,该如何处理,这使其成为一种特殊情况。

以下内容似乎不起作用,因为它只会删除key2的记录。在一般情况下有这样的方法吗?

i = transaction.objectStore( name ).index( 'a' );
i.delete( 2 );

谢谢。

随着我了解更多信息并查看了下面的代码,这些代码可以生成所需的结果,我现在不确定为什么它会起作用。键为复合键[ topic, note ],而k仅设置为主题值。因此,n中的任何键都不应该与k相匹配,对吗?

我不明白为什么n.openCursor( k )返回任何要处理的记录,因为没有一个简单的键。是将k视为记录的关键字还是索引值?

T = DB_open.base.transaction( ['notes'], 'readwrite' ),
o = T.objectStore( 'notes' ),
k = IDBKeyRange.only( topic_value );
n = T.objectStore( 'notes' ).index( 'topic' );

n.openCursor( k ).onsuccess = ( e ) =>  { /* stepped through cursor */ };

似乎我不了解的是,索引的key参数不是实际记录的键,而是索引的键,这里是主题值。对于读取操作和游标,效果很好;但是索引上没有删除方法,例如与deleteAll等效的getAll

我想我在几个月前编写游标代码时一定已经理解了这一点,但是现在我很困惑,试图在不打开游标的情况下删除特定索引值的记录集。

1 个答案:

答案 0 :(得分:0)

  

似乎我不了解的是,索引的key参数不是实际记录的键,而是索引的键,这里是主题值。对于读取操作和游标,效果很好;但是索引上没有删除方法,例如与deleteAll等效的getAll

您是正确的,key是索引键。而且没有单个命令说“删除与索引中某个键或键范围匹配的每条记录”。 Here is some discussion about this-我的解释是,对于该功能尚无很好的论据,但这是一个罕见的用例,它只是作为未实现的功能请求而存在。

但是,如果主键是复合键,并且复合键中的第一个条目是要过滤的字段,则可以使用KeyRange并将其传递给IDBObjectStore.delete

  

在这种特定情况下,a是一个排除零的正整数,而b是一个包含零的正整数。是否可以保证从[n,0]到[n + 1,0]的键范围返回等于索引a=n的所有键,而不管b的值如何?例如,IDBKeyRange.bound([2,0],[3,0],false,true)将返回索引a=2的所有键?

是的,那行得通。

您也可以自己玩看它:

var range = IDBKeyRange.bound( [2,0], [3,0], false, true);
console.log(range.includes([2, -1])); // false
console.log(range.includes([2, 0])); // true
console.log(range.includes([2, 100])); // true
console.log(range.includes([2, Infinity])); // true
console.log(range.includes([3, 0])); // false

只是为了好玩...您还可以这样定义键范围:

var range = IDBKeyRange.bound( [2,0], [2,""], false, true);

因为数字在字符串之前排序。您可以通过多种其他方式来编写相同的内容。一切都取决于如何在IndexedDB规范中完成跨类型比较。一旦有了数组或多个类型,事情就会变得有趣起来。

相关问题