index.openCursor()和store.openCursor()之间有什么区别?

时间:2015-07-13 10:32:49

标签: indexeddb

所以我有一个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还是有其他好处吗?

1 个答案:

答案 0 :(得分:3)

你错过了什么。索引的目的是存储筛选的值列表。过滤已经完成,因此您不需要在将光标前进到索引时对比较值进行测试。

如果要迭代所有项目,请使用商店。

如果要迭代商店中特定的项目子集,请使用索引,并迭代索引中的项目。

根据您计划使用的查询提前定义索引。

编辑:实际上,为了澄清一点,索引不会完全过滤,它会预先排序。

对象库中的对象按插入顺序或商店密钥存储。

根据索引的定义存储基于对象库的索引中的对象。

假设您只想获得propertyX等于value1的项目。

如果您遍历对象库,则会迭代商店中的所有项,并通过将propertyX与value1进行比较来保留您想要的项。

如果迭代了propertyX上的索引,可以使用IDBKeyRange.only作为openCursor的参数,设置为value1,并且不需要对迭代的值进行任何测试。您最终只会迭代匹配的值。 indexedDB引擎已经为您进行了过滤。它本身就是这样做的,它的效率非常高,几乎是使用索引的全部要点。