我目前的情况:
我使用React,NodeJS和Electron创建了一个应用程序。大多数用户都是一种离线用户。他们离线使用我的应用程序。
下一步计划:
现在,我打算为他们创建一个移动应用程序。我计划使用React-Native创建该应用程序。
由于他们的数据库处于脱机状态,我计划在桌面应用程序中为他们提供sync to firebase button
。当他点击sync to firebase button
时,其本地mongodb中的数据应与firebase同步。
我的想法:
new: true
。updated: true
然后当用户按下Sync to firebase
时,我将搜索这些记录并在firebase上添加/更新/删除相应的记录,然后我将从mongodb数据库中删除这些密钥。
执行我的想法时遇到的问题:
起初它并没有让我觉得好事,因为我觉得它很耗时,因为我会在firebase和mongodb上进行操作。
这种方法的另一个问题是,如果我认为反过来,当用户从React-Native应用程序添加/更新/删除记录时,firebase会将这些键新行/更新/删除,然后当用户按下时桌面应用程序中的同步按钮,我将不得不做相同的事情,但相反。
另一个问题是,如果用户意外卸载了我的应用程序然后重新安装,那么我该怎么办?
最大的问题是管理所有事情。
我的期望:
所以,我想要一种干净,可维护的方法。有没有人知道如何将数据从mongodb同步到firebase,反之亦然?
答案 0 :(得分:2)
两个数据库系统都支持某种操作日志或触发系统。您可以使用这些更新对数据库进行更新,以便几乎实时地同步它们。
您可以使用Oplog查看对数据库所做的更改(插入/更新/删除)并运行适当的函数来同步firebase。
有上限的集合,用于存储逻辑写入的有序历史记录 到MongoDB数据库。 oplog是启用的基本机制 MongoDB中的复制。
有一些小型库可以帮助您轻松订阅这些活动。
示例(mongo-oplog
)
import MongoOplog from 'mongo-oplog'
const oplog = MongoOplog('mongodb://127.0.0.1:27017/local', { ns: 'test.posts' })
oplog.tail();
oplog.on('op', data => {
console.log(data);
});
oplog.on('insert', doc => {
console.log(doc);
});
oplog.on('update', doc => {
console.log(doc);
});
oplog.on('delete', doc => {
console.log(doc.o._id);
});
您可以使用Cloud Functions。使用云功能,您可以观看Cloud Firestore Triggers或Realtime Database Triggers等触发器,并运行一个函数来同步MongoDB数据库。
借助云功能,您可以处理Firebase实时中的事件 数据库无需更新客户端代码。云功能让您 以完全管理权限运行数据库操作 确保单独处理对数据库的每个更改。
// Listens for new messages added to /messages/:pushId/original and creates an
// uppercase version of the message to /messages/:pushId/uppercase
exports.makeUppercase = functions.database.ref('/messages/{pushId}/original').onWrite((event) => {
// Grab the current value of what was written to the Realtime Database.
const original = event.data.val();
console.log('Uppercasing', event.params.pushId, original);
const uppercase = original.toUpperCase();
// You must return a Promise when performing asynchronous tasks inside a Functions such as
// writing to the Firebase Realtime Database.
// Setting an "uppercase" sibling in the Realtime Database returns a Promise.
return event.data.ref.parent.child('uppercase').set(uppercase);
});