猫鼬-保持本地数据库与远程数据库同步

时间:2019-06-12 21:08:41

标签: node.js mongodb mongoose

我可以访问两个我想保持同步的数据库,一个是新数据库,另一个是现有数据库,它们将位于单独的物理位置。新版本将用于服务外部API,因此,为了减少请求时间,我认为只查询本地数据库中的API请求是有意义的。

我最初的方法是使用mongoose.createConnection并将本地集合限制为次要元数据并直接访问远程集合,但这就是我现在要避免的事情。

另一种方法可能是使用mongoose.createConnection来定期查询远程数据库并更新本地数据库,但是如果我想进行频繁的更新,则可能会很昂贵。

有许多降低成本的方法-例如,现有数据库的相关集合中有一个lastUpdated属性,该属性可用于将远程查询限制为最近更新的记录,例如:< / p>

RemoteCollection.find({
   lastUpdated: {$gte: Date.now() - lookbackPeriod}
})

但是我想知道是否有mongoose / mongoDB的任何本机功能可以更有效地用于进行更新。我还考虑过mongodumpmongorestore来保留我所需记录的完整本地副本,但这似乎也很昂贵。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

经过一番阅读并感谢Jake的评论,看来它正在工作。我需要做更多的设置,但是下面的代码应该可以正常工作,并且基于文档中的这一部分:

https://mongoosejs.com/docs/models.html#change-streams

第一步是从mongod标志开始--replSet

mongod --replSet "rs0" --bind_ip localhost,<hostname(s)|ip address(es)>

然后关闭并重新启动mongo,然后在数据库上运行rs.initiate()。然后,您可以使用rs.status()检查副本集的状态。如果该命令有效并返回结果,则副本集功能应该存在。

然后在Node中,您可以执行以下操作:

// The docs reference creating a new model but you can just import an existing one

const RemotePerson = require('./models/RemotePerson');
const LocalPerson = require('./models/LocalPerson');

RemotePerson.watch().on('change', data => {
    if (data.operationType === "insert") {
        LocalPerson.create(data.fullDocument);
    } else if (data.operationType === "update") {
        LocalPerson.findByIdAndUpdate(data.documentKey, {
            $set: data.updateDescription.updatedFields
        });
    }
});