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 以加载所有子对象(并排序)。
我的 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 以加载所有子对象(并排序)。