我正在尝试使用IndexedDB来解决离线问题,它将填充当前存储在MongoDB数据库(就是现在的)中的数据。
一旦数据存储在IndexedDB中,可能会在MongoDB服务器上更改,我需要传播这些更改。是否有任何现有的框架或库可以像这样为Mongo做某些事情?我已经知道CouchDB / PouchDB,并不探索这两个。
我正在尝试使用IndexedDB来解决离线问题,它将填充当前存储在MongoDB数据库(就是现在的)中的数据。
一旦数据存储在IndexedDB中,可能会在MongoDB服务器上更改,我需要传播这些更改。是否有任何现有的框架或库可以像这样为Mongo做某些事情?我已经知道CouchDB / PouchDB,并不探索这两个。
[2021年同步解决方案]
我知道问题是针对MongoDB具体而言的,但由于这是一个旧帖子,我认为读者可能正在寻找新应用程序或重建的其他解决方案。我真的建议检查一下AceBase,因为它完全符合您当时要求的条件。
AceBase是一个免费且开源的实时数据库,可以轻松地在浏览器和服务器数据库之间进行存储和同步。它在浏览器中使用IndexedDB,在服务器上使用自己的二进制db / SQL Server / SQLite存储。离线编辑在重新连接时同步,并通过websocket(快速!)实时通知客户端进行远程数据库更改。
此外,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'}`);
}
});
});
了解更多示例和文档,请访问 npmjs.com 上的 AceBase 实时数据库引擎
我没有使用过IndexDB,但设计问题并不罕见。我理解你的应用程序是当客户端连接到MongoDB时,你会将一组文档下载到本地存储并断开连接。然后客户端可以在本地执行操作(未连接到数据服务器),然后推送更改。
我认为你需要处理两种一般情况: