对于一个具有数组键 [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
。
我想我几个月前写游标代码时可能已经理解了这一点,但现在在尝试删除特定索引值的一组记录时却感到困惑,而不开启游标。