IDBKeyRange 是 IndexedDB 中限定游标扫描键范围的核心工具,通过 lowerBound、upperBound、bound 和 only 四种方式创建,影响遍历起止位置但不改变索引结构;使用时需匹配索引键路径与值类型,并注意 open 参数、方向及字符串前缀匹配等细节。

IDBKeyRange 是 IndexedDB 中用于限定游标(cursor)扫描范围的核心工具,它不直接过滤数据,而是控制游标在对象存储(object store)中遍历的起始与终止键区间。
创建 IDBKeyRange 的四种基本方式
根据是否包含边界值和方向,常用构造方法有:
- IDBKeyRange.lowerBound(lower, open):从 lower 开始向后扫描;open = true 表示不包含 lower 键本身
- IDBKeyRange.upperBound(upper, open):扫描至 upper 结束;open = true 表示 upper 不参与结果
- IDBKeyRange.bound(lower, upper, lowerOpen, upperOpen):同时指定上下界,两个 open 参数分别控制两端是否开区间
- IDBKeyRange.only(value):仅匹配完全等于 value 的单个键(常用于精确查找)
在 openCursor 中使用 IDBKeyRange
调用 objectStore.openCursor(range) 即可将游标限制在指定键范围内。注意:range 只影响键的遍历顺序和范围,不改变索引结构或查询逻辑。
例如,要遍历用户年龄在 18(含)到 65(不含)之间的记录:
立即学习“前端免费学习笔记(深入)”;
const range = IDBKeyRange.bound(18, 65, false, true);
const request = store.openCursor(range);
request.onsuccess = function(event) {
const cursor = event.target.result;
if (cursor) {
console.log(cursor.key, cursor.value); // key 是 age 字段值(假设按 age 建索引)
cursor.continue();
}
};
配合 index 使用时的注意事项
若在索引(index)上调用 openCursor,IDBKeyRange 应基于该索引的键路径值构造,而非主键。例如:
- 有一个 emailIndex 索引,键路径为 "email"
- 想查邮箱以 "admin@" 开头的用户,需用 IDBKeyRange.lowerBound("admin@"),但注意字符串比较规则:它会包含 "admin@a"、"admin@z",但不保证前缀精确匹配(IndexedDB 按 Unicode 编码字典序比较)
- 如需严格前缀匹配,建议结合 IDBKeyRange.bound("admin@", "admin@\uffff")(\uffff 是 Unicode 最大字符)
常见误区与调试建议
- IDBKeyRange 对 null、undefined、Date 对象等特殊值有明确排序规则,使用前应验证实际键类型是否一致
- 游标方向(next / prev)会影响 range 的生效逻辑:例如 upperBound(100) 在 prev 方向下会从最大键开始倒序走到 100,而非“小于等于 100 的所有键”
- 若游标未返回预期数据,先检查 range 是否为空(IDBKeyRange.lowerBound(5).includes(3) 返回 false)、索引是否已正确创建、以及键路径是否与 range 值类型匹配


















