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

wyyhbhjk  于 2022-12-09  发布在  IndexedDB
关注(0)|答案(1)|浏览(159)

My Dexie Database db.playground(id为audioFiles)保存了音频文件的信息。用户必须分析这些音频文件,并添加标记(因此这是一个模拟过程,而不是编程过程),一旦完成,用户点击保存按钮,音频文件的属性“analyzed”必须设置为“true”。
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(这是Vue中的一个React元素)获得了这样一个音频文件的当前id。
到目前为止,我试图更新特定音频文件的“analyzed”属性的尝试完全失败。这是我尝试做的(根据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
})

不过,这感觉非常笨拙。有没有更短,更简洁,更专业的方法来完成这一点?
更新
这里真实的的问题是我的方法。因此,即使接受的答案不能直接解决我的问题(当涉及到类似的事情时,stackoverflow是非常严格的),我还是决定把它标记为“接受”,因为它解释了正确的数据结构设置的路径。所以,如果你发现自己处于这种情况下,考虑重新考虑你的设置。

wkftcu5l

wkftcu5l1#

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

相关问题