IDBKeyRange.only(key)是IndexedDB API中用于精确匹配单个主键值的键范围方法,需配合objectStore.get()或openCursor()使用,不支持模糊匹配,且键类型必须严格一致。

HTML5 本身并没有提供名为 Only 的方法用于索引键值匹配或数据检索。
常见误解来源:IDBKeyRange.only() 是 IndexedDB 的 API,不是 HTML5 整体特性
你提到的 “Only 方法” 实际上属于 IndexedDB API(HTML5 标准中的一部分,但属于底层客户端数据库接口),其核心是 IDBKeyRange.only(key)。它用于在对象存储(Object Store)中精确查找**单个主键值**对应的记录。
-
作用:创建一个只匹配指定键值的键范围,常配合
objectStore.get()或objectStore.openCursor()使用。 -
不支持模糊匹配或复合键直接精确匹配:若主键是数组(如
["user1", "2024"]),IDBKeyRange.only(["user1", "2024"])才算精确;用字符串则不匹配。 -
注意 null 和 undefined:若键为
null,IDBKeyRange.only(null)有效;但传入undefined会抛错。
正确使用 IDBKeyRange.only() 检索数据的步骤
以打开数据库、获取单条记录为例:
- 先通过
indexedDB.open()打开数据库,升级时定义对象存储及主键/索引。 - 事务中获取对象存储:
const store = tx.objectStore("users"); - 构造精确键范围:
const range = IDBKeyRange.only(123);(假设主键是 number 类型的 ID) - 执行查询:
const request = store.get(range);或更常用的是直接store.get(123)(get 方法内部已隐式处理单值) - 监听
request.onsuccess获取结果:if (request.result) { console.log(request.result); }
比 only() 更灵活的替代方案
当需要按非主键字段精确查找时,仅靠 only() 不够,需结合索引:
- 创建唯一索引:
objectStore.createIndex("byEmail", "email", { unique: true }); - 用索引 + only 查找:
const idx = store.index("byEmail"); const req = idx.get("test@example.com"); - 若索引非唯一(允许重复 email),则用
openCursor(IDBKeyRange.only("test@example.com"))遍历所有匹配项。
容易忽略的关键细节
实际开发中以下几点常导致“查不到”:
-
键类型必须严格一致:数据库存的是数字
42,却用字符串"42"查询 → 不匹配。 - 自动递增主键不能用 only() 反向查值:如果主键是自增 number,但你想按 name 查,必须建索引,不能依赖 only()。
-
异步时序问题:未等
onsuccess就访问request.result→ 得到 undefined。 - 版本升级遗漏索引:旧数据没索引,新索引建了但历史记录不在索引中 → 查询为空。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











