我想知道是否可以使用通配符对 indexeddb 对象存储执行搜索。例如,查找所有以“555”开头的键的对象会很方便
4 回答
这可以使用复合键或键片段开箱即用。键在 IndexedDB 中的工作方式是您生成一个“keyRange”对象并将其传递给您的游标调用。键范围传递信息,例如“从 A 开始,在 Z 结束,包括在内”。
从本质上讲,其中内置了部分匹配;缺点是您的光标将返回键之间的任何键,您可能需要进一步过滤这些结果。
假设您将这些词作为对象存储中的键:
- 土豚
- 苹果
- 谷歌
- 微软
键范围“A 到 Z,包括”将返回所有这些,但“Ap 到 Z,包括”将只返回最后三个。
我用来实现这一点的另一种技术是将“过滤器”函数传递给调用 IndexedDB 的方法。在方法 onsuccess 回调中,event.target.result
通过您的过滤器函数传递结果 (),如果它返回 true,则调用您的方法调用程序的 onsuccess 回调。
是的,使用通配符是可行的。
我还不能投票甚至评论以前的答案(嗯......)所以我只会重复 user2025527 的答案,因为它完全符合我的需要。
使用 bounds 方法并为第一个参数指定基值,为第二个参数指定相同的值加上一个额外的字符。
在大多数情况下,多余的字符应该是字符集中的最后一个字符:\uffff
但是您可以自由决定什么构成限制,尤其是在处理本地化时。
以免您的索引中有以下值:
- 一种
- AB
- 乙
- 文学学士
- BB
- C
要查找带有“BA”的所有内容,您应该使用
var range = IDBKeyRange.bound("BA", "BA" + '\uffff');
默认情况下这是不可能的,但我为 indexeddb 编写的库支持它。尝试linq2indexeddb。
在 indexeddb 中也可以使用通配符进行搜索,请参阅链接IndexedDB Fuzzy Search
对于下面的通配符应该可以工作: var range = IDBKeyRange.bound("555", "555" + '\uffff');
或者可以使用Linq2indexeddb 库来使用like。