【问题标题】:Dexie.js: Update nested object via dynamic idDexie.js:通过动态 id 更新嵌套对象
【发布时间】:2021-12-26 05:24:06
【问题描述】:

我的 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(这是 Vue 中的反应元素)获取此类音频文件的当前 ID。

到目前为止,我尝试更新特定音频文件的“已分析”属性已完全失败。这就是我试图做的(根据 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 对此类问题非常严格),我还是决定将其标记为“已接受”,因为它解释了正确数据结构设置的路径. 因此,以防万一您发现自己处于这种情况,请考虑重新考虑您的设置。

【问题讨论】:

    标签: indexeddb dexie dexiejs


    【解决方案1】:

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

    【讨论】:

    • 感谢您的反馈!拥有单独的对象是以前的解决方案,当然更容易管理。 – 但是,在返回之前,我宁愿学习如何找到嵌套对象的路径,其中动态 id 不在第一级 – 正如我在第一个代码示例中所示。没有办法解决吗?
    • 我不认为当字段是动态的时候你可以表达一个静态的字段路径来更新。
    • 谢谢你,乔希!我将我的设置重构为您描述的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-20
    • 2021-11-17
    • 2021-11-15
    • 1970-01-01
    相关资源
    最近更新 更多