对于具有[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
不是整数,该如何处理,这使其成为一种特殊情况。
以下内容似乎不起作用,因为它只会删除key
为2
的记录。在一般情况下有这样的方法吗?
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
。
我想我在几个月前编写游标代码时一定已经理解了这一点,但是现在我很困惑,试图在不打开游标的情况下删除特定索引值的记录集。
答案 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规范中完成跨类型比较。一旦有了数组或多个类型,事情就会变得有趣起来。