将数据从mongoDB同步到firebase,反之亦然

Vis*_*hal 6 javascript database mongodb node.js firebase

我目前的情况:

我使用React,NodeJS和Electron创建了一个应用程序.大多数用户都是一种离线用户.他们离线使用我的应用程序

下一步计划:

现在,我打算为他们创建一个移动应用程序.我计划使用React-Native创建该应用程序.

由于他们的数据库处于脱机状态,我计划给他们一个sync to firebase button桌面应用程序.当他点击时sync to firebase button,他们本地mongodb中的数据应该与firebase同步.

我的想法:

  • 当一条新记录被添加到mongodb时,我将存储一条新记录,该记录如下:new: true.
  • 当记录更新时,我将存储一个名为的密钥 updated: true
  • 类似的删除...

然后当用户按下时Sync to firebase,我将搜索这些记录并在firebase上添加/更新/删除相应的记录,然后我将从mongodb数据库中删除这些键.

执行思路时遇到的问题:

起初它并没有让我觉得好东西,因为我认为它很耗时,因为我将在firebase和mongodb上进行操作.

这种方法的另一个问题是,如果我想反过来,当用户添加/更新/删除阵营原生应用程序的记录,火力将有那些键的新/更新/删除,然后当用户按下同步按钮桌面应用程序,我将不得不做同样的事情,但相反.

另一个问题是,如果用户意外卸载了我的应用程序然后重新安装它,那我该怎么办?

最大的问题是管理所有事情.

我的期望:

所以,我想要一个干净,可维护的方法.有没有人知道如何将数据从mongodb同步到firebase,反之亦然?

ben*_*nel 5

两种数据库系统都支持某种操作日志或触发器系统。您可以使用这些来实时更新对数据库的更改,以几乎实时地同步它们。

对于 MongoDB

您可以使用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);
});
Run Code Online (Sandbox Code Playgroud)

对于 Firebase

您可以使用云函数。使用 Cloud Functions,您可以查看Cloud Firestore 触发器或实时数据库触发器等触发器,并运行同步 MongoDB 数据库的函数。

借助 Cloud Functions,您无需更新客户端代码即可处理 Firebase 实时数据库中的事件。Cloud Functions 允许您以完全管理权限运行数据库操作,并确保对数据库的每个更改都单独处理。

// 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);
});
Run Code Online (Sandbox Code Playgroud)

  • @Vishal,或者您可以通过在他们上网时自动执行“在线时单击按钮”(或记住这样做)来免除他们的痛苦。 (2认同)