我需要构建一个mongo更新程序来将mongodb数据下载到本地IoT设备(配置数据等)
我的目标是以固定的间隔(例如1分钟)观看一些mongo集合。如果我更改了一个集合(删除,插入或更新),我会将完整的集合下载到我的设备上。这些集合的简单记录不会超过几百个,因此下载的数据不会很多。
是否有任何机制可以找出自上一个池以来收集已发生变化?在这种情况下应该使用哪些mongo功能?
答案 0 :(得分:7)
要收听对MongoDB集合的更改,请设置Mongoose Model.watch
。
const PersonModel = require('./models/person')
const personEventEmitter = PersonModel.watch()
personEventEmitter.on('change', change => console.log(JSON.stringify(change)))
const person = new PersonModel({name: 'Thabo'})
person.save()
// Triggers console log on change stream
// {_id: '...', operationType: 'insert', ...}
注意::此功能仅在MongoDB复制服务器复制包
上可用
有关更多信息,请参见Mongoose Model Docs
如果您想收听对 DB 所做的更改,请使用Connection.watch
。
有关更多信息,请参见Mongoose Connection Docs
从v3.6开始,这些函数从Change Events监听MongoDB Change Streams
答案 1 :(得分:1)
我认为最好的解决方案是使用更新后的中间件。
您可以在此处详细了解 http://mongoosejs.com/docs/middleware.html
答案 2 :(得分:0)
我对完全自主运行的嵌入式设备有相同的要求,并且始终有必要自动调整运行参数而不必重新启动系统。
为此,我创建了一个配置管理器类,并在其构造函数中编写了一个“参数监视器”,该参数监视器仅检查数据库中为其标记的参数,当然,如果需要监视新的配置,我会通知在代码的另一部分中使用config -manager重新加载此类更新。
如您所见,该过程非常简单,当然可以进行改进,以避免使用许多更新使config-manager超载,并防止它们以很小的间隔重叠。
由于要读取许多设置,因此在连接并打开数据库后,我将打开一个查询游标。数据流向我发送新数据时,我为其创建一个proxy,以便可以根据Config-manager的类型和内部详细信息对其进行操作。然后,我检查是否需要监视该属性,如果是,则调用一个我创建的内部函数watch来处理此问题,它查询同名子项目以查看检入数据库所需的默认时间。通过更新,从而为该任务注册超时,并且每次检查都会使用更新的时间重新创建超时,或者如果不再存在监视,则会中断更新。
this.connection.once('open', () => {
let cursor = Config.find({}).cursor();
cursor.on('data', (doc) => {
this.config[doc.parametro] = criarProxy(doc.parametro, doc.valor);
if (doc.watch) {
console.log(sprintf("Preparando para Monitorar %s", doc.parametro));
function watch(configManager, doc) {
console.log("Monitorando parametro: %s", doc.parametro);
if (doc.watch) setTimeout(() => {
Config.findOne({
parametro: doc.parametro
}).then((doc) => {
console.dir(doc);
if (doc) {
if (doc.valor != configManager.config[doc.parametro]) {
console.log("Parametro monitorado: %(parametro)s, foi alterado!", doc);
configManager.config[doc.parametro] = criarProxy(doc.parametro, doc.valor);
} else
console.log("Parametro monitorado %{parametro}s, não foi alterado", doc);
watch(configManager, doc);
} else
console.log("Verifique o parametro: %s")
})
},
doc.watch)
}
watch(this, doc);
}
});
cursor.on('close', () => {
if (process.env.DEBUG_DETAIL > 2) console.log("ConfigManager closed cursor data");
resolv();
});
cursor.on('end', () => {
if (process.env.DEBUG_DETAIL > 2) console.log("ConfigManager end data");
});
如您所见,代码可以改进很多,如果您想根据您的环境或通用名称提出改进建议,请使用要点:https://gist.github.com/carlosdelfino/929d7918e3d3a6172fdd47a59d25b150