IDBKeyRange 是 IndexedDB 中定义键范围的核心接口,支持 lowerBound、upperBound、bound 和 only 四种方式精确控制区间边界(含/不含端点),用于 cursor 或 get 查询,要求键类型一致且实例不可变。
IDBKeyRange
是 IndexedDB 中用于定义键范围的核心接口,特别适合做数值区间查询。它不直接执行检索,而是作为参数传给
或
等方法,告诉数据库“我要查哪些键”。关键在于边界配置——即如何精确控制是否包含端点值。
单边范围:from、to 最常用
数值检索最常见的是“大于等于某值”或“小于等于某值”,对应
和
:
→ 匹配键 ≥ 10(含 10)
→ 匹配键 > 10(不含 10)
→ 匹配键 ≤ 100(含 100)
→ 匹配键 < 100(不含 100)
第二个布尔参数叫
,
表示开区间(不包含端点),
或省略表示闭区间(包含端点)。这是控制边界的唯一开关。
双边范围:bound 精确圈定区间
当需要“10 到 100 之间”这类查询时,用
:
立即学习
“
前端免费学习笔记(深入)
”;
→ 10 ≤ 键 ≤ 100(两端都闭)
→ 10 < 键 ≤ 100(左开右闭)
→ 10 < 键 < 100(两端都开)
参数顺序为
。注意:如果下界大于上界,会抛出
异常,需提前校验。
唯一特殊值:only 用于精确匹配
不是范围,而是“只匹配这个值”。它等价于
,但语义更清晰,且性能略优:
→ 只返回键严格等于 42 的记录
若该键不存在,游标直接结束,不会报错
适用于主键查询或已知唯一索引字段的查找,比用
多一层范围语义保障。
实际使用注意事项
数值范围检索依赖键路径的数据类型一致性。如果存储的键是字符串形式的数字(如
),比较将按字典序进行,
会成立,导致结果错乱:
确保键是真正的 number 类型(如用 autoIncrement 或显式 number 键)
若必须用字符串数字,统一补零或转成固定长度格式(不推荐,易出错)
在 objectStore 创建时指定
并启用
,手动控制键类型
另外,IDBKeyRange 本身不可变,每次查询需新建实例;它也不校验数据是否存在,仅约束游标遍历范围。
objectStore.openCursor()objectStore.get()IDBKeyRange.lowerBound()IDBKeyRange.upperBound()IDBKeyRange.lowerBound(10)IDBKeyRange.lowerBound(10, true)IDBKeyRange.upperBound(100)IDBKeyRange.upperBound(100, true)opentruefalseIDBKeyRange.bound()IDBKeyRange.bound(10, 100)IDBKeyRange.bound(10, 100, true, false)IDBKeyRange.bound(10, 100, true, true)(lower, upper, lowerOpen, upperOpen)DataErrorIDBKeyRange.only(value)bound(value, value)IDBKeyRange.only(42)get()"10""2" > "10"keyPathautoIncrement: false