我定义了一个 graphQl 模式,每当 mongodb 集合中添加新字段时,都需要在运行时更改该模式。例如,一个集合之前只有两个字段
person {
"age" : "54"
"name" : "Tony"
}
后来添加了一个新字段“高度”。
person {
"age" : "54"
"name" : "Tony"
"height" : "167"
}
我需要更改我的 graphql 架构并为其添加高度。那么我如何获得来自 Mongodb 的警报或通知?
最佳答案
MongoDB 本身并不实现事件消息传递。您本身无法获知数据库、集合或文档更新。
但是,MongoDB 集成了 'operation log'功能,它允许您访问集合上每个写入操作的日志日志。
日志日志用于 MongoDB 副本,也称为集群同步功能。为了激活 oplogs
,您需要至少有两个 MongoDB 实例,一个主实例和 a replicate .
操作日志基于 capped collection
功能,允许通过仅追加机制构建集合,从而确保快速写入和尾随游标。作者说:
The oplog exists internally as a capped collection, so you cannot modify its size in the course of normal operations.
还有:
Capped collections are fixed-size collections that support high-throughput operations that insert and retrieve documents based on insertion order. Capped collections work in a way similar to circular buffers: once a collection fills its allocated space, it makes room for new documents by overwriting the oldest documents in the collection.
操作日志日志中的文档架构如下所示:
"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"
表示插入的对象。
同样,您可以获知更新
操作:
"op" : "u",
"ns" : "wiktory.items",
"o2" : {
"_id" : ObjectId("533022d70d7e2c31d4490d22")
},
"o" : {
"$set" : {
"outofprint" : true
}
}
请注意,操作日志(您将它们作为集合访问)在磁盘大小或条目数 (FIFO) 方面受到限制。这意味着,最终,无论您的 oplog 使用者比 oplog 编写者慢,您都会错过操作日志条目,从而导致消费结果损坏。
这就是 MongoDB 在保证高度请求集群上的文档跟踪方面表现不佳的原因,也是诸如 Apache Kafka 之类的消息传递解决方案的原因。作为事件跟踪的补充(例如:事件文档更新
)
回答您的问题:在合理请求的环境中,您可能需要查看 Javascript Meteor project ,它允许您根据查询结果的变化触发事件,并依赖于 MongoDB oplog 功能。
鸣谢:oplogs 示例来自 The MongoDB Oplog
关于mongodb - 当新字段添加到 mongodb 集合时如何收到通知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45176486/