7

我想知道是否可以使用通配符对 indexeddb 对象存储执行搜索。例如,查找所有以“555”开头的键的对象会很方便

4

4 回答 4

5

这可以使用复合键或键片段开箱即用。键在 IndexedDB 中的工作方式是您生成一个“keyRange”对象并将其传递给您的游标调用。键范围传递信息,例如“从 A 开始,在 Z 结束,包括在内”。

从本质上讲,其中内置了部分匹配;缺点是您的光标将返回键之间的任何键,您可能需要进一步过滤这些结果。

假设您将这些词作为对象存储中的键:

  • 土豚
  • 苹果
  • 谷歌
  • 微软

键范围“A 到 Z,包括”将返回所有这些,但“Ap 到 Z,包括”将只返回最后三个。

我用来实现这一点的另一种技术是将“过滤器”函数传递给调用 IndexedDB 的方法。在方法 onsuccess 回调中,event.target.result通过您的过滤器函数传递结果 (),如果它返回 true,则调用您的方法调用程序的 onsuccess 回调。

于 2012-03-20T22:12:37.727 回答
5

是的,使用通配符是可行的。

我还不能投票甚至评论以前的答案(嗯......)所以我只会重复 user2025527 的答案,因为它完全符合我的需要。

使用 bounds 方法并为第一个参数指定基值,为第二个参数指定相同的值加上一个额外的字符。

在大多数情况下,多余的字符应该是字符集中的最后一个字符:\uffff

但是您可以自由决定什么构成限制,尤其是在处理本地化时。

以免您的索引中有以下值:

  • 一种
  • AB
  • 文学学士
  • BB
  • C

要查找带有“BA”的所有内容,您应该使用

var range = IDBKeyRange.bound("BA", "BA" + '\uffff');
于 2014-01-04T06:08:06.103 回答
2

默认情况下这是不可能的,但我为 indexeddb 编写的库支持它。尝试linq2indexeddb

于 2012-08-13T06:09:12.027 回答
1

在 indexeddb 中也可以使用通配符进行搜索,请参阅链接IndexedDB Fuzzy Search

对于下面的通配符应该可以工作: var range = IDBKeyRange.bound("555", "555" + '\uffff');

或者可以使用Linq2indexeddb 库来使用like。

于 2013-04-18T08:55:19.563 回答