【发布时间】:2014-07-11 11:30:46
【问题描述】:
在这里阅读了很长时间后,我终于注册问一个问题。我最近一直在搞乱IndexedDB,偶然发现了复合索引的问题(我使用它们与示例here 类似)。
我在对象存储中有一个带有字符串值和几个整数值的对象。例如:
[description:text, value1:int, value2:int, value3:int]
我在这个对象上创建了一个复合索引,如下所示:
("compoundIndex", ["value1" , "value2" , "value3"] , { unique: false });
在 html 中,我有几个选择框和一个文本字段,允许用户搜索特定条目。整数作为键范围传递给索引上的 opencursor 函数。然后我在结果集上使用 indexOf(textfield) (如完成here)
如果选择框有值,则该值用作上限和下限。如果未触及选择框,则下限为 1,上限为我声明的 MAX_INT 变量(如 here 所述)。
示例代码:
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 的天真理解使我相信它会在搜索中考虑所有数组字段。由于对象以及我使用的索引比上面的示例复杂得多,因此对多个索引执行搜索会非常混乱。
感谢您的见解!
编辑: 在第一次 cmet 之后让它更清楚一点。假设对象存储中有以下对象:
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 与键范围不匹配。
【问题讨论】:
-
感谢您的光临。我们在 IDB 标签上获得了很多新用户。如果您真的已经“在这里阅读了很多年”,那么既然您已经注册了,我鼓励您返回并支持一些您认为有帮助的答案。它将奖励我们中的一些人,他们试图确保 StackOverflow 是一个向 IndexedDB 提问的好地方。
-
@buley:当然。我会重新审视我设置的书签。 :) 编辑:哦,我只是想我需要 15 的声望才能投票...
标签: javascript html indexeddb compound-index