在这里阅读了很长时间后,我终于注册了一个问题。我最近一直在搞乱IndexedDB,偶然发现了复合索引的问题(我使用它们与此处的示例类似)。
我在对象存储中有一个带有字符串值和几个整数值的对象。例如:
[description:text, value1:int, value2:int, value3:int]
我在这个对象上创建了一个复合索引,如下所示:
("compoundIndex", ["value1" , "value2" , "value3"] , { unique: false });
在 html 中,我有几个选择框和一个文本字段,允许用户搜索特定条目。整数作为键范围传递给索引上的 opencursor 函数。然后我在结果集上使用 indexOf(textfield) (就像在此处完成的那样)
如果选择框有值,则该值用作上限和下限。如果未触及选择框,则下限为 1,上限为我声明的 MAX_INT 变量(如此处所述)。
示例代码:
transaction = db.transaction(["schaden"] , "readonly").objectStore("schaden");
index = transaction.index("compoundIndex");
// keyrange-arrays from another function
lowerBound = [valueOneLower, valueTwoLower, valueThreeLower];
upperBound = [valueOneUpper, valueTwoUpper, valueThreeUpper];
range = IDBKeyRange.bound( lowerBound, upperBound );
index.openCursor(range).onsuccess = function(e){
var cursor = e.target.result;
if (cursor){
if (getTextfield.length == 0){
console.log("Entry found: " + cursor.value.description + ". Object: " + JSON.stringify(cursor.value));
}else if (cursor.value.bezeichnung.indexOf(getTextfield) !== -1){
console.log("Entry found: " + cursor.value.description + ". Object: " + JSON.stringify(cursor.value));
};
cursor['continue']();
};
};
当我在所有选择框中设置了所有值时,我可以很好地搜索条目。但是,如果我打开一个字段,它会打乱搜索。假设我没有触及 value1-select 框,并将其他框设置为 2,我将得到 lowerBound = [1,2,2] 和 upperBound = [4294967295,2,2]。这将使我返回 IDB 中的所有条目,它不考虑第二个和第三个值。
这是故意的吗?或者有没有办法解决这个问题?我一直在寻找有关这方面的信息,但似乎陷入了死胡同。我对这个 API 的天真理解使我相信它会在搜索中考虑所有数组字段。由于对象以及我使用的索引比上面的示例复杂得多,因此对多个索引执行搜索会非常混乱。
感谢您的见解!
编辑:在第一条评论之后让它更清楚一点。假设对象存储中有以下对象:
obj1 { val1 = 1 , val2 = 3 , val3 = 1 }
obj2 { val1 = 1 , val2 = 2 , val3 = 2 }
obj3 { val1 = 2 , val2 = 1 , val3 = 3 }
obj4 { val1 = 1 , val2 = 1 , val3 = 1 }
obj5 { val1 = 1 , val2 = 2 , val3 = 3 }
索引按预期方式对其进行排序:
#1 [1,1,1] obj4
#2 [1,2,2] obj2
#3 [1,2,3] obj5
#4 [1,3,1] obj1
#5 [2,1,3] obj3
假设现在我搜索范围 (lower[1,1,1] , upper[1,1,1]) 我会得到 obj4。这是所有选择框都选择选项 1 时的行为。现在,如果我搜索 val1 = 1、val2 = unknown 和 val3 = 1 的条目,我得到以下范围:lower[1,1,1],upper[ 1,4294967295,1]。预期结果是 obj4 [1,1,1] 和 obj1 [1,3,1]。结果不是这些,而是给了我 4 个命中,即 obj4、obj2、obj5 和 obj1,尽管 obj2 和 obj5 的 val3 与键范围不匹配。