首页 > 解决方案 > 如何获取所有 IDBIndex 键值(而不是对象存储主键)?

问题描述

我有一个带有主键和附加索引(具有唯一键约束)的 IndexedDB 对象存储。

现在我想检索这个索引的所有键值。

以前,我使用 IDBIndex.getAllKeys(),但显然此方法的行为已更改为返回对象存储主键而不是索引键。(但是,我无法在浏览器发行说明中找到任何文档或参考...)

所以我的问题是:检索所有索引键值的推荐、最高效的方法是什么?

标签: indexeddb

解决方案


IDBIndex.getAll会起作用,但它会将所有值读入内存,这可能会很慢。

你是正确的,IDBIndex.getAllKeys只返回主键,而不是索引键。

不幸的是,没有类似的单个函数会返回索引键,但您可以使用IDBIndex.openKeyCursor并避免将值读入内存:

const result = [];

index.openKeyCursor().onsuccess = (event) => {
    var cursor = event.target.result;
    if (cursor) {
        // cursor.key is the index key, cursor.primaryKey is the primary key,
        // and cursor.value is undefined because we're using openKeyCursor
        // rather than openCursor.
        result.push(cursor.key);
        cursor.continue();
    } else {
        cb(result);
    }
};

我没有对此进行基准测试,但理论上它可能接近于getAllKeys,尽管可能至少有点慢,因为它需要触发和处理 N 个事件而不是一个。

只是不要在 MS Edge 中尝试 :)

以前,我使用 IDBIndex.getAllKeys(),但显然此方法的行为已更改为返回对象存储主键而不是索引键。(但是,我无法在浏览器发行说明中找到任何文档或参考...)

如果您使用的是indexeddb-getall-shim,早期版本确实会错误地返回索引键而不是主键。这从未在规范中,只是垫片中的一个错误。既然我写了垫片……如果这确实是您困惑的根源,我深表歉意!


推荐阅读