2017-07-18 35 views
1

我有一个graphQl模式定义,每当在MongoDB集合中添加一个新字段时,都需要更改运行时。例如,一个集合只有两个字段之前如何在将新字段添加到mongodb集合时收到通知?

person { 
      "age" : "54" 
      "name" : "Tony" 
      } 

然后添加一个新字段“height”。

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

      } 

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

回答

0

MongoDB本身不会实现事件消息传递。您本身不能获得关于数据库,馆藏或文档更新的信息。

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

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

操作日志基于capped collection功能构建,该功能允许通过只追加机制构建集合,这可确保快速写入和尾随游标。作者说:

oplog内部存在一个封顶的集合,所以你不能在正常操作过程中修改它的大小 。

MongoDB - Change the Size of the Oplog

和:

封顶集合是支持 是插入和检索基于 插入顺序文件的高通量操作固定大小的集合。 Capped集合的工作方式与循环 缓冲区类似:一旦集合填满其分配的空间,它将通过覆盖 集合中最早的文档为新文档创建空间 。

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是可怕的保证在高sollicited集群文件跟踪的原因,以及为什么如Apache Kafka的信息解决方案来作为补充事件跟踪的原因(例如:事件document update

要回答你的问题:在一个合理的请求环境中,你可能想看看Javascript Meteor project,它允许你基于查询结果的变化触发事件,并依赖于MongoDB的oplog特性。

现金oplogs例子从The MongoDB Oplog

相关问题