IndexedDB IDBKeyRange 复合/多重索引不起作用

标签 indexeddb compound-index

谁能解释为什么我的 IDBKeyRange 似乎只在第一列上过滤?

我有一个定义如下的索引:

osDrugs.createIndex("combined", ["name", "strength", "form", "packsize"], {unique: false});

我的查询大致如下:
var transaction = pimsDB.transaction("drugs");
var objectStore = transaction.objectStore("drugs");
var range = IDBKeyRange.bound([tmpName, tmpStrength, tmpForm, tmpPack],[tmpName+"z", tmpStrength + "z", tmpForm+"z", tmpPack+"z"]);
var index = objectStore.index("combined");
var request = index.openCursor(range);

我的结果似乎是从 tmpName 过滤到 tmpName + "z"但完全忽略了强度、形式和包装大小。

谁能看到我做错了什么?

哦,所有字段都存储为字符串....

干杯,



附加信息:

我使用复合索引创建的另一个表似乎正在工作。这些表之间仅有的两个区别如下:

1) 有效的表在索引中只有 2 个属性。
2) 在有效的表中,两个属性都是 3 个属性主键的一部分。

我已经通过使用 Chrome 中的“资源”选项卡测试了它是否适用于该表,该选项卡允许我通过下限键过滤索引并返回数据。

更多附加信息:

经过一些更多的测试,并切换到 FF 以确保它不是 Chrome ,但我遇到了我想我已经找到了问题。我不相信搜索复合索引会像我期望的那样工作......

IDBKeyRange 实际上是一个范围...看来,当我输入时,例如,

["PARA","500","TAB","32"]
["PARAZ","500z","TABz","32z"]

IndexedDB 搜索从 LB 开始的第一个药物,并选择直到最后一个以上限结束的药物为止。

我相信,这就是为什么它设法选择以任何值(value)开始的优势。它实际上不是过滤以“500”开头的强度,而是选择药物上第一个“500”到最后一个实例之间的所有内容。

如果我的假设是正确的,那么下面的文章可能有点错误/误导(因为我相信用户想要搜索一个矩形而不是一个范围:

Indexed DB cursor ranges on mulitiple properties

任何人都可以确认我发现了什么并告诉我是否有一种方法可以在多个值上实际搜索 IndexedDB?在上面文章的底部,有人提到了一个 intersect 函数,我认为它会起作用,但是当我在线搜索时,它似乎不存在...

干杯,

最佳答案

我已经在以下位置发布了一个通用的解决方案:

https://gist.github.com/inexorabletash/704e9688f99ac12dd336

简短的总结是您需要检查结果的每个维度,如果任何值超出该维度的范围,请跳到下一个可能的键。

关于IndexedDB IDBKeyRange 复合/多重索引不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21731347/

相关文章:

Mongodb 使用错误的索引

MongoDB 索引,是否可以同时创建普通索引和复合索引?

c# - 在 C# 中创建复合索引

ruby-on-rails - 多列唯一 Rails 索引无法正常工作

javascript - IndexedDB 中的最大项目大小

indexeddb - IndexedDB 请求或事务在此时发送

javascript - 如何检查 indexedDB 实例是否打开?

mysql 复合索引也索引单个字段吗?

javascript - 在不破坏现有保存的情况下更改保存的应用程序数据格式的策略 (JavaScript+IndexedDB)

angular - 获取 indexedDb 配额存储信息