首页 > 解决方案 > IDBIndex.getAll() 是否返回排序列表?

问题描述

我正在研究IDBIndex.getAll()IndexedDB API 的方法。但是,从文档中不清楚调用此方法的结果是否应该是已排序或未排序的索引条目列表。

此外,所有使用有序结果的示例都是手动使用光标来检索条目,这是进行有序查询的唯一方法吗?

标签: javascriptindexeddb

解决方案


我在规范中看到以下信息:

https://www.w3.org/TR/IndexedDB/#object-store-construct对象存储有一个记录列表,其中包含存储在对象存储中的数据。每条记录由一个键和一个值组成。该列表按 key 升序排列。给定的对象存储中永远不会有多个具有相同键的记录。

https://www.w3.org/TR/IndexedDB/#index-construct 索引中的记录总是根据记录的键排序。然而,与对象存储不同的是,给定的索引可以包含具有相同键的多条记录。此类记录还根据索引记录的值(即引用对象存储中记录的键)进行排序。

https://www.w3.org/TR/IndexedDB/#cursor-construct 对于游标迭代索引,情况稍微复杂一些,因为多条记录可以具有相同的键,因此也按值排序。当迭代索引时,游标也有一个对象存储位置,它指示索引中先前找到的记录的值。查找下一个合适的记录时会使用位置和对象存储位置。

https://www.w3.org/TR/IndexedDB/#cursor-iteration-operation 记录总是按升序排列。在源是索引的情况下,记录按升序排列(其中索引中的值是引用对象存储中记录的键)。

https://www.w3.org/TR/IndexedDB/#object-store-retrieval-operation要使用 targetRealm、store、range 和可选计数从对象存储中检索多个值,请运行以下步骤: ... 让记录包含存储键在范围内的记录列表中的第一个计数记录的列表。

我的猜测是内部getAll是一个微不足道的实用装饰器,openCursor因此我们可以推断它遵循相同的排序标准。

https://chromium.googlesource.com/chromium/src/+/66.0.3359.158/third_party/WebKit/Source/modules/indexeddb/docs/idb_overview.md 所有 IDB 查询都限定为单个对象存储(即,没有等效的SQL 连接数)。IDB 支持单键 CRUD(get、put、delete)。IDB 还支持基于范围的检索(get、getAll)和迭代(如许多 RDBMS 实现使用的游标)。迭代遵循源(对象存储或索引)的隐式排序,但可以按照正向/升序或反向/降序进行。


推荐阅读