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



有人能解释为什么我的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",但完全忽略了强度、形式和包大小。

有人看到我做错了什么吗?

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

干杯,

Dan

附加信息:

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

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

我已经通过使用Chrome中的"资源"选项卡测试了它在这个表上的工作原理,该选项卡允许我通过下界键过滤索引并返回数据。

更多附加信息:

经过更多的测试,并切换到FF以确保它不是铬,但我正在经历,我想我已经发现了问题。我不相信搜索合成索引会像我预期的那样工作。。。

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

["PARA"、"500"、"TAB"、"32"]["PARAz"、"500z"、"TABz"、"32z"]

IndexedDB搜索从LB开始的第一种药物,并选择所有内容,直到最后一种药物在上限结束。

我相信,这就是为什么它要设法选择从任何价值开始的优势。实际上,它并不是过滤从"500"开始的强度,而是选择药物上第一个"500"到最后一个之间的所有内容。

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

多个属性上的索引DB光标范围

有人能确认我的发现并告诉我是否有办法在多个值上搜索IndexedDB吗?在上面文章的底部,有人提到了一个相交函数,我认为它会起作用,但当我在网上搜索时,它似乎并不存在。。。

干杯,

Dan

我在上发布了一个通用解决方案

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

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

相关内容

  • 没有找到相关文章

最新更新