如何在mongodb集合中添加新字段时收到通知?

时间:2017-07-18 20:29:04

标签: mongodb graphql

我定义了一个graphQl模式,只要在mongodb集合中添加了新字段,就需要更改运行时。例如,一个集合在

之前只有两个字段
    person { 
             "age" : "54"
             "name" : "Tony"
           }

后来一个新的领域,"身高"被添加。

        person { 
             "age" : "54"
             "name" : "Tony"
             "height" : "167"

           }

我需要更改我的graphql架构并为其添加高度。那么如何从Mongodb收到警报或通知?

2 个答案:

答案 0 :(得分:1)

从MongoDb 3.6开始,您可以订阅更改流。您可以订阅"更新"事件操作。更多细节在这里:

https://stackoverflow.com/a/47184757/5103354

答案 1 :(得分:0)

MongoDB本身并不实现事件消息传递。当然,您无法了解数据库,集合或文档更新。

但是,MongoDB集成了一个'operation log'功能,允许您访问集合上每个写操作的日志日志。

日志日志用于MongoDB副本,即群集同步功能。要激活oplogs,您需要至少有两个MongoDB实例,一个主服务器和a replicate

操作日志基于capped collection功能构建,该功能允许通过仅附加机制构建集合,从而确保快速写入和拖尾游标。作者说:

  

oplog在内部作为上限集合存在,所以你不能   在正常操作过程中修改其大小。

     

MongoDB - Change the Size of the Oplog

  

上限集合是支持的固定大小的集合   基于的高吞吐量操作,插入和检索文档   插入顺序。加盖的集合以类似于圆形的方式工作   缓冲区:一旦集合填充其分配的空间,它就会腾出空间   通过覆盖最旧的文档来获取新文档   集合。

     

MongoDB - Capped Collections

操作日志日志中的文档架构如下所示:

"ts" : Timestamp(1395663575, 1),
"h" : NumberLong("-5872498803080442915"),
"v" : 2,
"op" : "i",
"ns" : "wiktory.items",
"o" : {
  "_id" : ObjectId("533022d70d7e2c31d4490d22"),
  "author" : "JRR Hartley",
  "title" : "Flyfishing"
  }
}

例如:"op" : "i"表示操作是插入,"o"是插入的对象。

同样,您可以了解update操作:

"op" : "u",
"ns" : "wiktory.items",
"o2" : {
  "_id" : ObjectId("533022d70d7e2c31d4490d22")
},
"o" : {
  "$set" : {
    "outofprint" : true
  }
}

请注意,操作日志(您将其作为集合访问)受限于磁盘大小或条目编号(FIFO)。这意味着,最终,只要您的oplog消费者比oplog编写者慢,您就会得到错过的操作日志条目,从而导致消费结果损坏。

这就是为什么MongoDB很难保证高度解析的群集上的文档跟踪,以及Apache Kafka等消息传递解决方案作为事件跟踪补充(例如:事件document update)的原因

回答您的问题:在合理征求的环境中,您可能需要查看Javascript Meteor project,它允许您根据查询结果的更改触发事件,并依赖于MongoDB oplog功能。

致谢:来自The MongoDB Oplog

的oplogs示例