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 , более раннюю версиюВерсия ошибочно вернула ключи индекса, а не первичные ключи.Это никогда не было в спецификации, просто ошибка в прокладке.Так как я написал шим ... мои извинения, если это действительно источник вашего замешательства!