Dexie.js通过动态id更新嵌套对象的优化方案咨询
解决方案
1. 直接修复动态路径更新写法
你之前的点语法更新失败是ES6语法错误:动态对象键需要用方括号包裹为计算属性,Dexie本身完全支持嵌套路径的局部更新:
const updatedItem = await db.playground.update('audioFiles', { [`audio_file_data.${this.fileData.id}.analysed`]: true })
该写法无需读取全量数据,直接对目标嵌套属性做局部更新,和你最初的预期效果一致。
2. 现有回写方案简化
如果需要保留全量读取覆写的逻辑,可简化冗余的遍历操作,直接通过文件id索引访问目标对象:
const dbFileEntry = await db.playground.get('audioFiles') dbFileEntry.audio_file_data[this.fileData.id].analysed = true const updated = await db.playground.put(dbFileEntry)
3. 推荐长期优化:调整数据结构
当前单条记录存全量音频文件的设计会随着文件量增长带来明显的性能损耗,最优方案是单独建立音频文件表:
表结构定义示例
// 初始化数据库时新增独立表 const db = new Dexie('你的数据库名') db.version(1).stores({ audioFiles: 'id, analysed' // 主键为文件id,可按需添加其他索引字段 })
单字段更新代码
const updated = await db.audioFiles.update(this.fileData.id, { analysed: true })
该方案的优势:
- 单次更新仅操作目标单条记录,IO开销降至最低
- 支持直接按id、analysed状态等字段查询,无需拉取全量数据过滤
- 新增/删除音频文件均为单记录操作,无全量覆写开销
内容的提问来源于stack exchange,提问作者Robert Wildling
相关产品推荐
相关产品推荐

