猫鼬如何收听收藏变化

时间:2018-01-15 19:56:13

标签: mongodb mongoose

我需要构建一个mongo更新程序来将mongodb数据下载到本地IoT设备(配置数据等)

我的目标是以固定的间隔(例如1分钟)观看一些mongo集合。如果我更改了一个集合(删除,插入或更新),我会将完整的集合下载到我的设备上。这些集合的简单记录不会超过几百个,因此下载的数据不会很多。

是否有任何机制可以找出自上一个池以来收集已发生变化?在这种情况下应该使用哪些mongo功能?

3 个答案:

答案 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