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

标签 javascript mongodb indexeddb

我正在尝试评估使用 IndexedDB 解决离线问题。它将填充当前存储在 MongoDB 数据库中的数据(按原样)。

一旦数据存储在 IndexedDB 中,它可能会在 MongoDB 服务器上发生更改,我需要传播这些更改。是否有任何现有的框架或库可以为 Mongo 做这样的事情 。我已经知道 CouchDB/PouchDB 并且不会探索这两个。

最佳答案

[2021 年同步解决方案]

我知道所问的问题是专门针对 MongoDB 的,但由于这是一个旧线程,我认为读者可能正在为新应用程序或重建寻找其他解决方案。我真的可以推荐查看AceBase因为它完全符合您当时的要求。

AceBase 是一个免费的开源实时数据库,可以轻松地在浏览器和服务器数据库之间进行存储和同步。它在浏览器中使用 IndexedDB,在服务器上使用自己的二进制 db/SQL Server/SQLite 存储。重新连接时会同步离线编辑,并通过 websocket 实时通知客户端远程数据库更改(FAST!)。

除此之外,AceBase 有一个称为“实时数据代理”的独特功能,它允许您将内存中对象的所有更改持久化并同步到本地和服务器数据库,以及远程更改以自动更新您的 in -内存对象。这意味着您可以完全忘记数据库编码,并像只使用本地对象一样进行编码。无论您是在线还是离线。

以下示例展示了如何在浏览器中创建本地 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'}`); 
        }
    });
});

有关更多示例和文档,请参阅 AceBase realtime database engine在 npmjs.com

关于javascript - 将 MongoDB 服务器数据同步到 IndexedDB 本地存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12087958/

相关文章:

javascript - 如何重命名mongodb atlas中已经存在的集合?

javascript - IndexedDb 获取索引中的所有匹配项

javascript - indexedDB setVersion 请求被阻止?

javascript - 调用号码的 toString 方法

javascript - 如何在无限滚动回调中初始化wow.js

javascript - 底层颜色不同时颜色基础不同

javascript - 如何使用户能够有效地将 indexedDB 对象存储的内容保存到文件中?

javascript - 如何实现跨浏览器不透明度渐变(不是颜色渐变)

不带replicaSet可选参数的MongoDB URL

node.js - 在 mongoDB 中的嵌套记录中查找(通过引用 ObjectId 嵌套)