私は数ヶ月前に質問をしました。メテオには答えがあるようです。MeteorはMongoDBクエリの結果をどのように更新しますか?
Which, if any, of the NoSQL databases can provide stream of *changes* to a query result set?
どう流星は、MongoDBのクエリの結果に更新を受け取るのでしょうか?
ありがとう、
Chris。
私は数ヶ月前に質問をしました。メテオには答えがあるようです。MeteorはMongoDBクエリの結果をどのように更新しますか?
Which, if any, of the NoSQL databases can provide stream of *changes* to a query result set?
どう流星は、MongoDBのクエリの結果に更新を受け取るのでしょうか?
ありがとう、
Chris。
:サーバー上
は、その名前のコレクションは、バックエンドモンゴサーバー上に作成されます。サーバー上でそのコレクションのメソッドを呼び出すと、 は通常のMongo操作に直接変換されます。
クライアントでは、Minimongoインスタンスが作成されます。 Minimongoは本質的に純粋なJavaScriptの のMongoのインメモリで非永続的な実装です。このクライアントが動作しているデータベースのサブセットである だけを格納するローカルキャッシュとして機能します。クライアント(検索)の に関するクエリは、 がサーバーと通信することなく、このキャッシュから直接配信されます。
あなたは、クライアント上のデータベース(挿入、更新、削除)への書き込み、 コマンドは同時に、クライアント上ですぐに実行、および、 され、それがサーバーにアップし出荷してもそこに実行です。 これはlivedataパッケージによって処理されます。私が集めることができるものから、クライアントにサーバー
サーバーにクライアントを説明
はlivedataとモンゴ-livedataパッケージです。
https://github.com/meteor/meteor/tree/master/packages/mongo-livedata
https://github.com/meteor/meteor/tree/master/packages/livedata
お役に立てば幸いです。
この場合、query.observe()
が必要です。タグフィールド付きのPosts
コレクションがあり、important
タグ付きの投稿が追加されたときに通知を受けたいとします。あなたは、各ブラウザのポストの変更に何かをしたい場合は
http://docs.meteor.com/#observe
// collection of posts that includes array of tags
var Posts = new Meteor.Collection('posts');
// DB cursor to find all posts with 'important' in the tags array.
var cursor = Posts.find({tags: 'important'});
// watch the cursor for changes
var handle = cursor.observe({
added: function (post) { ... }, // run when post is added
changed: function (post) { ... } // run when post is changed
removed: function (post) { ... } // run when post is removed
});
あなたは、クライアント上でこのコードを実行することができます。また、重要な投稿が追加されたときにチームに電子メールを送信すると言うと、サーバー上でこれを実行することもできます。
added
およびremoved
は、ドキュメントではなくクエリを参照していることに注意してください。既存のポスト文書を持っていると
Posts.update(my_post_id, {$addToSet: {tags: 'important'}});
を実行する場合、これはポストには、クエリ結果に追加取得しているので、「追加」コールバックをトリガします。ドキュメントから
これは非常に良い答えですが、この質問には当てはまりません。私はMeteorがMongoDBからの変更の流れをどのように得るのか、Meteorから変更を得る方法ではないかと尋ねていました。 – fadedbee
現在、Meteorは実際には1つのインスタンス/プロセスでうまく動作します。そのような場合、すべてのクエリはこのインスタンスを通過し、それを他のクライアントにブロードキャストできます。さらに、外部クエリによって行われたデータベースの変更について、10秒ごとにMongoDBをポーリングします。スケーラビリティを向上させるための1.0の計画であり、うまくいけば、複数のインスタンスがそれぞれの変更を通知することが可能です。
DerbyJSは、Redis PubSubを使用しています。
私がテストしなかったことの1つは、Meteorの* outside *で行われたMongoDBコレクションの挿入がクライアントに伝播されるかどうかということです。 – fadedbee
私はコードをスキミングしましたが、Meteorがコレクションの更新をMongoDBから通知された行は見えません。 – fadedbee
@chrisdew MongoDBに直接レコードを挿入したところ、ブラウザに表示されました。だから私はサーバーが通知を受けると思います。 –