IndexedDB 中统计记录总数应使用 count() 方法,它是游标和索引对象的异步方法,可传 key 或 keyRange 限定范围,返回 IDBRequest,成功时 event.target.result 为数字;需在活跃只读事务中调用。

HTML5 的 IndexedDB 中并没有直接叫 Count 的方法,真正用于统计对象仓库(Object Store)中记录总数的是 count() 方法,它是游标(IDBCursor)和索引(IDBIndex)对象提供的一个异步操作。
count() 方法的基本用法
该方法用于快速获取匹配条件的记录数量,无需遍历全部数据,性能优于手动计数。它返回一个 IDBRequest 对象,通过监听 onsuccess 获取结果值。
- 调用位置:只能在事务活跃时,通过对象仓库或其索引调用
- 参数可选:可传入 key 或 keyRange 来限定统计范围;不传则统计全部记录
- 返回值:成功时,
event.target.result是一个数字(记录总数)
统计整个对象仓库的记录总数
这是最常见需求,比如显示“共 128 条数据”。需确保事务处于 active 状态,并正确打开对象仓库:
const transaction = db.transaction(['users'], 'readonly');
const store = transaction.objectStore('users');
const request = store.count(); // 不传参 → 统计所有记录
request.onsuccess = function(event) {
const total = event.target.result;
console.log('总记录数:', total); // 如:128
};
结合 keyRange 实现条件统计
利用 IDBKeyRange 可实现带范围的统计,例如统计年龄在 20–30 岁之间的用户数(前提是 age 字段已建索引):
立即学习“前端免费学习笔记(深入)”;
- 先在对象仓库中为
age创建索引:store.createIndex('ageIndex', 'age'); - 再通过索引调用 count:
const index = store.index('ageIndex');
const range = IDBKeyRange.bound(20, 30);
const request = index.count(range);
request.onsuccess = function(event) {
console.log('20–30岁人数:', event.target.result);
};
注意事项与常见问题
实际使用中容易忽略几个关键点:
- 事务生命周期:count() 必须在事务完成前调用,否则报错 “Transaction is inactive”
-
只读事务:统计操作应使用
'readonly'模式,避免不必要的锁竞争 - 异步时机:不能在 request.send 后立即读 result,必须等 onsuccess 触发
- 兼容性:IE 完全不支持 IndexedDB,旧版 Safari 对 count() 支持较晚(iOS 10.3+ / macOS 10.12.4+)


















