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

4

对于一个具有数组键 [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

我想我几个月前写游标代码时可能已经理解了这一点,但现在在尝试删除特定索引值的一组记录时却感到困惑,而不开启游标。

2个回答

2
看起来我没有理解的是,索引的key参数并不是实际记录的键,而是索引的键,这里是主题值。对于读操作和游标,这很好用;但是在索引上没有删除方法,比如一个deleteAll相当于getAll
您是正确的,key是索引键。并且没有单个命令可以说“删除索引中与某个键或键范围匹配的每个记录”。 这里有一些关于此事的讨论 - 我的理解是,没有太多反对该功能存在的论据,但它是一个罕见的用例,因此它只是作为未实现的功能请求而存在。
但是,如果主键是复合键,并且复合键中的第一个条目是您想要过滤的字段,则可以使用KeyRange并将其传递给IDBObjectStore.delete,就像您建议的那样:
在这种特定的情况下,a是正整数而不包括零,b是正整数且包括零。不管b的值如何,一个从[n,0]到[n+1,0]的键范围是否能保证返回所有等于索引a=n的键?例如,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 规范中跨类型比较的实现方式。一旦涉及到数组或多种类型,事情就会变得有趣起来。

0

1
百分比,欢迎提供解决方案的链接,但请确保您的回答即使没有它也有用:在链接周围添加上下文,以便您的同行用户了解它是什么以及为什么存在,然后引用您链接到的页面上最相关的部分,以防目标页面不可用。[那些只是链接而已的答案可能会被删除。] (/help/deleted-answers) - M--

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接