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

What is the difference between index.openCursor() and store.openCursor()?

所以我有一个 IndexedDB 数据库,我通过几个索引存储东西。

获取这些项目后,我可以按照

的路线进行
store.openCursor().onsuccess = function(e)
{
    var cursor = e.target.result;
}

或者我可以使用从数据库中获取另一个索引然后打开游标

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 是否有其他好处?

你错过了一些东西。索引的目的是存储过滤后的值列表。过滤已经完成,因此您无需在将光标移至索引时针对比较值进行测试。

如果您想遍历所有项目,请使用商店。

如果您想迭代商店中的特定项目子集,请使用索引,然后迭代索引中的项目。

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

编辑:实际上,为了更清楚一点,索引并不是完全过滤,而是预先排序。

对象存储中的对象按插入顺序或存储键存储。

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

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

如果您遍历一个对象存储,您将遍历存储中的 所有 项,并通过比较 propertyX 和 value1 只保留您想要的项。

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