我可以访问两个我想保持同步的数据库,一个是新数据库,另一个是现有数据库,它们将位于单独的物理位置。新版本将用于服务外部API,因此,为了减少请求时间,我认为只查询本地数据库中的API请求是有意义的。
我最初的方法是使用mongoose.createConnection
并将本地集合限制为次要元数据并直接访问远程集合,但这就是我现在要避免的事情。
另一种方法可能是使用mongoose.createConnection
来定期查询远程数据库并更新本地数据库,但是如果我想进行频繁的更新,则可能会很昂贵。
有许多降低成本的方法-例如,现有数据库的相关集合中有一个lastUpdated
属性,该属性可用于将远程查询限制为最近更新的记录,例如:< / p>
RemoteCollection.find({
lastUpdated: {$gte: Date.now() - lookbackPeriod}
})
但是我想知道是否有mongoose / mongoDB的任何本机功能可以更有效地用于进行更新。我还考虑过mongodump
和mongorestore
来保留我所需记录的完整本地副本,但这似乎也很昂贵。
感谢您的帮助。
答案 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
});
}
});