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

时间:2014-02-12 14:54:39

标签: 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”但完全忽略了力量,形式和packize。

谁能看到我做错了什么?

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

干杯,

其他信息:

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

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

我已经通过使用Chrome中的“资源”标签测试了它在此表上的作用,它允许我通过下限键过滤索引并返回数据。

更多其他信息:

经过一些更多的测试,并切换到FF,以确保它不是铬,但我遇到了我认为我发现了问题。我不相信搜索复合索引按照我期望的方式工作......

IDBKeyRange实际上是一个范围...例如,当我进入时,似乎是

[ “PARA”, “500”, “TAB”, “32”] [ “PARAz”, “500Z”, “TABz”, “32Z”]

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

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

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

Indexed DB cursor ranges on mulitiple properties

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

干杯,

1 个答案:

答案 0 :(得分:1)

我发布了一个广义的解决方案:

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

简短摘要是您需要检查结果的每个维度,如果任何值超出该维度的范围,请跳到下一个合理的密钥。

相关问题