所以我有一个IndexedDB数据库,我用几个索引存储东西。
取出这些物品后,我可以走
的路线store.openCursor().onsuccess = function(e)
{
var cursor = e.target.result;
}
或者我可以使用从DB中获取另一个索引然后打开游标
var index = store.index("indexA");
index.openCursor.onsuccess = fucntion(e)
{
var cursor = e.target.result;
}
然后通过相同的集合进行迭代。
我仍然需要做一些比较来过滤我想要的结果。
即
if(cursor.value.IndexA == searchValue)
{
//Found a result for by this index.
}
cursor.continue();
所以我的问题是我错过了什么,因为我觉得通过我不知道的索引来使用openCursor
还是有其他好处吗?
答案 0 :(得分:3)
你错过了什么。索引的目的是存储筛选的值列表。过滤已经完成,因此您不需要在将光标前进到索引时对比较值进行测试。
如果要迭代所有项目,请使用商店。
如果要迭代商店中特定的项目子集,请使用索引,并迭代索引中的项目。
根据您计划使用的查询提前定义索引。
编辑:实际上,为了澄清一点,索引不会完全过滤,它会预先排序。
对象库中的对象按插入顺序或商店密钥存储。
根据索引的定义存储基于对象库的索引中的对象。
假设您只想获得propertyX等于value1的项目。
如果您遍历对象库,则会迭代商店中的所有项,并通过将propertyX与value1进行比较来保留您想要的项。
如果迭代了propertyX上的索引,可以使用IDBKeyRange.only作为openCursor的参数,设置为value1,并且不需要对迭代的值进行任何测试。您最终只会迭代匹配的值。 indexedDB引擎已经为您进行了过滤。它本身就是这样做的,它的效率非常高,几乎是使用索引的全部要点。