Dexie.js:通过动态id更新嵌套对象

Dexie.js: Update nested object via dynamic id

我的 Dexie 数据库 db.playground(ID audioFiles)包含有关音频文件的信息。这些音频文件必须由添加标记的用户进行分析(因此这是一个模拟过程,而不是程序化过程),一旦完成,用户单击保存按钮并且音频文件的属性“已分析”必须是设置为“真”。

Dexie 对象如下所示:

// db.playground
{
  id: 'audioFiles', 
  audio_file_data: {
    0: {id: 0, analysed: false, …}
    1: {id: 1, analysed: false, …}
    2: {id: 2, analysed: false, …}
  }
}

“audio_file_data”中的文件数量发生变化,当然,id 也会发生变化。我通过变量 this.fileData.id 获取此类音频文件的当前 ID(这是 Vue 中的反应元素)。

我尝试更新特定音频文件的“已分析”属性 到目前为止完全失败了。这是我尝试做的(根据 Dexie 文档,点符号应该与嵌套元素一起使用):

const updatedItem = await db.playground.update('audioFiles', {
  `audio_file_data.${this.fileData.id}.analysed`: true
})

但由于错得离谱,这让事情变得一团糟。

然而,这个解决方案,它检索、操作然后重新分配整个集合,确实有效:

const dbFileEntry = await db.playground.get({ id: 'audioFiles' })
const fileCollection = dbFileEntry.audio_file_data
const file = fileCollection.find(item => {
    if (item.id === this.fileData.id) {
        item.analysed = true
        return item
    }
    return false
})
const updated = await db.playground.update('audioFiles', {
    'audio_file_data': fileCollection
})

不过感觉很笨拙。有没有更短、更简洁、更专业的方法来实现?


更新

这里真正的问题是我的方法。因此,即使已接受的答案并不能直接解决我的问题(并且 Whosebug 在处理此类问题时非常严格),我还是决定将其标记为“已接受”,因为它解释了正确数据结构设置的路径. 因此,以防万一您遇到这种情况,请考虑重新考虑您的设置。

您正在更新整个对象只是为了更新数组中的一个条目。也许将每个嵌套对象作为其自己的对象存储在对象存储中更容易?然后您可以根据需要添加、删除、编辑和重新排序。您可以在每个子对象中冗余存储父对象的详细信息。在每个子对象中存储父 ID,然后在父 ID 上创建索引,然后使用父 ID 索引在子对象存储上执行 getAll 以加载所有子对象(并排序)。