如何更新indexedDB中数组的对象?

问题描述 投票:0回答:1

例如我有一个对象数组:

const arrayOfPersons = [
    { name: 'Alex', ssn: 123, children: [
        { name: 'Tom', yearOfBirth: '2023', isHappy: true },
        { name: 'Emma', yearOfBirth: '2012', isHappy: true }
    ]},
    { name: 'John', ssn: 234, children: [
        { name: 'Harry', yearOfBirth: '2003', isHappy: true },
        { name: 'Eva', yearOfBirth: '2020', isHappy: true },
        { name: 'Henry', yearOfBirth: '1999', isHappy: true }
    ]}
];

数据库是使用以下代码创建的:

const request = indexedDB.open(nameOfDB, 1);

request.onerror = (event) => {
    console.error(`Database error: ${event.target.errorCode}`);
};

request.onupgradeneeded = (event) => {
    const db = event.target.result;
    const objectStore = db.createObjectStore(nameOfObjectStore, { keyPath: "ssn" });
};

我需要升级某个孩子的“isHappy”属性。最好的方法是什么?

这里我通过 get() 方法获取一个人,然后遍历他的所有孩子。

    const request = indexedDB.open(nameOfDB, 1);

    request.onerror = (event) => {
        console.error(`Database error: ${event.target.errorCode}`);
    };

    request.onsuccess = (event) => {
        const db = event.target.result;

        const personObjectStore = db
            .transaction(nameOfObjectStore, "readwrite")
            .objectStore(nameOfObjectStore);

        const getPersonRequest = personObjectStore.get(123);

        getPersonRequest.onsuccess = (event) => {
            const person = event.target.result;

            person.children.forEach( (child) => {
                if (child.name == 'Emma') {
                    child.isHappy = false;
                }
            });

            personObjectStore.put(person).onsuccess = (event) => {
                console.log('successfully updated');
            };
        }
    };

它有效,但看起来效率不高。

我还有一个问题。 put() 方法是否重写所有对象或仅更新修改的条目?我要处理的实际数据库包含许多巨大的数组,这些数组包含大量数据。

javascript indexeddb
1个回答
0
投票

它有效,但看起来效率不高。

考虑到您存储数据的方式,这可能是您所能达到的最高效的方式。数据库专家可能会说,您应该展平数据,以便子项位于自己的存储中,并使用诸如 [parent_ssn, name] 之类的复合索引,然后您可以直接查找该记录。

put() 方法是重写所有对象还是只更新修改过的条目?

它取代了整个记录。这是考虑以分解形式存储数据的另一个原因。但是......请记住,现代计算机和存储速度非常快,因此不要过早优化。小于几百千字节的值可能适合原子更新,但您应该在代表性硬件上进行性能测试或从野外收集指标来为这些决策提供信息。

© www.soinside.com 2019 - 2024. All rights reserved.