将MongoDB服务器数据同步到IndexedDB本地存储

brqmpdu1  于 2022-12-09  发布在  IndexedDB
关注(0)|答案(3)|浏览(432)

我正在尝试使用IndexedDB来解决离线问题。它将被当前存储在MongoDB数据库中的数据填充(按原样)。
一旦数据被存储在IndexedDB中,它可能会在MongoDB服务器上被更改,我需要传播这些更改。是否有任何现有的框架或库可以为Mongo做类似的事情。我已经知道CouchDB/PouchDB,不打算探索这两个。

ej83mcc0

ej83mcc01#

[2021年同步解决方案]
我知道这个问题是专门针对MongoDB的,但由于这是一个老主题,我想读者可能会为新应用程序或重建寻找其他解决方案。我真的可以推荐查看AceBase,因为它确实做了你当时正在寻找的事情。
AceBase是一个免费和开源的实时数据库,可以在浏览器和服务器数据库之间轻松存储和同步。它在浏览器中使用IndexedDB,在服务器上使用它自己的二进制db / SQL Server / SQLite存储。离线编辑在重新连接时同步,客户端通过WebSocket实时通知远程数据库更改(FAST!)。
除此之外,AceBase还有一个独特的特性,叫做“实时数据代理”,它允许你将内存中对象的所有更改持久化并同步到本地和服务器数据库,并允许远程更改自动更新内存中对象。这意味着你可以完全忘记数据库编码,就像你只使用本地对象一样编码。无论你是在线还是离线。
下面的示例显示了如何在浏览器中创建一个本地IndexedDB数据库,如何连接到与本地数据库同步的远程数据库服务器,以及如何创建一个实时数据代理以消除进一步的数据库编码。AceBase也支持身份验证和授权,但为了简单起见,我没有将其包括在内。

const { AceBaseClient } = require('acebase-client');
const { AceBase } = require('acebase');

// Create local database with IndexedDB storage:
const cacheDb = AceBase.WithIndexedDB('mydb-local');

// Connect to server database, use local db for offline storage:
const db = new AceBaseClient({ dbname: 'mydb', host: 'db.myproject.com', port: 443, https: true, cache: { db: cacheDb } });

// Wait for remote database to be connected, or ready to use when offline:
db.ready(async () => {

    // Create live data proxy for a chat:
    const emptyChat = { title: 'New chat', messages: {} };
    const proxy = await db.ref('chats/chatid1').proxy(emptyChat);  // Use emptyChat if chat node doesn't exist

    // Get object reference containing live data:
    const chat = proxy.value;

    // Update chat's properties to save to local database, 
    // sync to server AND all other clients monitoring this chat in realtime:
    chat.title = `Changing the title`;
    chat.messages.push({ 
        from: 'ewout', 
        sent: new Date(),
        text: `Sending a message that is stored in the database and synced automatically was never this easy!` +
              `This message might have been sent while we were offline. Who knows!`
    });

    // To monitor and handle realtime changes to the chat:
    chat.onChanged((val, prev, isRemoteChange, context) => {
        if (val.title !== prev.title) { 
            alert(`Chat title changed to ${val.title} by ${isRemoteChange ? 'us' : 'someone else'}`); 
        }
    });
});

有关更多示例和文档,请参见www.example.com上的AceBase realtime database enginenpmjs.com

yshpjwxd

yshpjwxd2#

使用resumeToken打开一个changeStream,但是由于我们讨论的是多个不同的数据库,因此无法保证因果一致性。

yfjy0ee7

yfjy0ee73#

我没有使用过IndexDB,但设计问题并不罕见。我对你的应用程序的理解是,当客户端连接到MongoDB时,你拉下一组文档进行本地存储,然后断开连接。然后客户端可以在本地(不连接到数据服务器)做事情,然后推送更改。
在我看来,你必须处理两种一般情况:
1.当MongoDB服务器更新并中断与客户端的连续性时,客户端必须
1.轮询数据(计时器?)或
1.保持WebSocket打开以允许通知在管道上自由流动
1.当用户需要将更改的数据沿管道向上推回时
1.您可以异步重新连接,检查状态更改,(根据业务规则解决冲突)
1.有一个服务器端(轻量级)接口来处理冲突(根据应用的复杂性,比较MongoDB和IndexedDB更新中状态变化的时间戳就足够了)

相关问题