Indexeddb:使用通配符进行搜索

Indexeddb: search using wildcards

本文关键字:搜索 通配符 Indexeddb      更新时间:2023-09-26

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

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

从本质上讲,这里面有部分匹配;缺点是,您的光标将返回位于键之间的任何键,您可能需要进一步筛选这些结果。

假设您在对象存储中有以下单词作为密钥:

  • Aardvark
  • 苹果
  • 谷歌
  • Microsoft

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

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

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

我还不能投票,甚至不能对之前的答案发表评论(嗯…),所以我只重复用户2025527的答案,因为它完全符合我的需求。

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

在大多数情况下,额外的字符应该是字符集中的最后一个:''ufff-

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

以免说你的索引中有以下值:

  • A
  • AB
  • B
  • BA
  • BB
  • C

要找到所有用"BA"表示的内容,您应该使用

var range = IDBKeyRange.bound("BA", "BA" + ''uffff');

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

indexeddb中也可以使用通配符进行搜索参见链接indexeddb模糊搜索

下面的通配符应该有效:var range=IDBKeyRange.bound("555","555"+'''ufff');

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

这里有一个多关键字索引示例供参考。如果您想在第二个键上排序,但只在第一个键上进行选择,这很有用。此外,仅供参考,如果需要,可以用与数组相同的方式定义主键。

const customerData = [
    { id: 1, sort: "888", name: "Bill",   email: "bill@company.com" },
    { id: 2, sort: "111", name: "Donna",  email: "donna1@home.org" },
    { id: 3, sort: "222", name: "Donna",  email: "donna2@home.org" },
    { id: 4, sort: "999", name: "Andy",   email: "andy@home.org" },
    { id: 5, sort: "444", name: "George", email: "george@home.org" },
    { id: 6, sort: "222", name: "Tim",    email: "tim@home.org" },
    { id: 7, sort: "111", name: "Luke",   email: "luke@home.org" }
];
const objectStore = db.createObjectStore("customers", { keyPath: "id" });
objectStore.createIndex("multiple", ["name","sort"], { unique: false });
const index = objectStore.index("multiple");
const boundRange = IDBKeyRange.bound(["Donna",""], ["Donna",""+''uffff']);
// for numeric columns use 0 instead of ""
//const boundRange = IDBKeyRange.bound(["Donna",0], ["Donna",0+''uffff']);
index.openCursor(boundRange, "prev").onsuccess = (event) => {
        const cursor = event.target.result;
        if (cursor) {
            console.error(`${cursor.key}, name: ${cursor.value.name}, sort: ${cursor.value.sort}, email: ${cursor.value.email}`);
            cursor.continue();
        }
    };