我定义了一个graphQl模式,只要在mongodb集合中添加了新字段,就需要更改运行时。例如,一个集合在
之前只有两个字段 person {
"age" : "54"
"name" : "Tony"
}
后来一个新的领域,"身高"被添加。
person {
"age" : "54"
"name" : "Tony"
"height" : "167"
}
我需要更改我的graphql架构并为其添加高度。那么如何从Mongodb收到警报或通知?
答案 0 :(得分:1)
从MongoDb 3.6开始,您可以订阅更改流。您可以订阅"更新"事件操作。更多细节在这里:
答案 1 :(得分:0)
MongoDB本身并不实现事件消息传递。当然,您无法了解数据库,集合或文档更新。
但是,MongoDB集成了一个'operation log'功能,允许您访问集合上每个写操作的日志日志。
日志日志用于MongoDB副本,即群集同步功能。要激活oplogs
,您需要至少有两个MongoDB实例,一个主服务器和a replicate。
操作日志基于capped collection
功能构建,该功能允许通过仅附加机制构建集合,从而确保快速写入和拖尾游标。作者说:
oplog在内部作为上限集合存在,所以你不能 在正常操作过程中修改其大小。
和
上限集合是支持的固定大小的集合 基于的高吞吐量操作,插入和检索文档 插入顺序。加盖的集合以类似于圆形的方式工作 缓冲区:一旦集合填充其分配的空间,它就会腾出空间 通过覆盖最旧的文档来获取新文档 集合。
操作日志日志中的文档架构如下所示:
"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示例