2017-07-18 8 views
1

私は、mongodbコレクションに新しいフィールドが追加されるたびにランタイムを変更する必要があるgraphQlスキーマを定義しました。たとえば、コレクションの前には2つのフィールドしかありません新しいフィールドがmongodbコレクションに追加されたときに通知を受け取る方法は?

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

その後、新しいフィールド「height」が追加されます。

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

      } 

グラフのスキーマを変更してその高さを追加する必要があります。では、どのようにMongodbからアラートや通知を受け取るのですか?

答えて

0

MongoDBはイベントメッセージングをネイティブに実装していません。ネイティブに、DB、コレクション、またはドキュメントの更新情報を入手することはできません。

ただし、MongoDBには'operation log'機能が組み込まれているため、コレクションの各書き込み操作のジャーナルログにア​​クセスできます。

ジャーナルログは、クラスタ同期機能とも呼ばれるMongoDBレプリカで使用されます。 oplogsを有効にするには、少なくとも2つの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)に限定されています。これは、最終的には、消費者が消費者よりも遅いことを意味します。操作ログの内容が失われ、消費の結果が損なわれます。あなたに答えるために

これは、MongoDBのは非常にsollicitedクラスタ上の追跡ドキュメントを保証するためのひどい理由であり、そのようなApache Kafkaなどのメッセージングのための解決策は、イベントのためのサプリメントとして来た理由は、(イベントdocument updateなど)の追跡します質問:合理的に募集された環境では、クエリ結果の変更に基づいてイベントをトリガーすることができ、MongoDBのoplog機能に依存するJavascript Meteor projectを見てみたいかもしれません。

クレジット:oplogs例The MongoDB Oplog

1

からのMongoDB 3.6の時点で、あなたは変更ストリームを購読することができます。あなたは、 "更新"イベント操作に加入することができます。詳細はこちら

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

関連する問題