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

标签 mongodb graphql

我定义了一个 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.

MongoDB - Change the Size of the Oplog

还有:

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.

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" 表示插入的对象。

同样,您可以获知更新操作:

"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/

相关文章:

javascript - 如何在 GraphQL 接口(interface)上将模型与 "has one"关系相关联

javascript - Apollo GraphQL 合并缓存数据

android - 在 React Native 应用程序中实现指纹登录

django - 如何限制来自 GraphQL API 端点的匿名用户?

mongodb - Mongo 中唯一的数组值

mongodb - 字段 "$name"必须是累加器对象

graphql - 将获得的字段传递给 GraphQL 中的另一个(嵌套)查询

architecture - 我应该有多个 GraphQL 实例还是只有一个?

mongodb - 如何在 Pharo 上使用 MongoTalk 查询嵌套属性?

mysql - 如何在单个 mongodb 查询中使用聚合求和、乘法、除法和分组