Meteorをプログラミングするときに扱う必要のあるさまざまな名前を区別しましょう:
- 変数名 、
Posts = new Meteor.Collection(...)
など 。これらは、コードがこの変数にアクセスする方法を知っている場合にのみ使用されます。 Meteorはそれが何であるかを知らないか、気にしませんが、慣例は資本化することです。 - コレクション名 、
new Meteor.Collection("posts")
など 。これは、MongoDBコレクション(サーバー上)またはminimongoコレクション(クライアント上)の名前にマップされます。 - 出版物とサブスクリプションの名前 、
Meteor.publish("foo", ...)
で使用されます またはMeteor.subscribe("foo")
。クライアントがサーバー上の一部のデータをサブスクライブするには、これらが一致している必要があります。
Meteorデータモデルで一致させる必要があるものは2つあります。
- 出版物の名前とそれに対応する購読
- (通常) デフォルトのコレクションモデルを使用している場合は、クライアントとサーバー上のコレクションの名前
サブスクリプション名は、常にパブリケーションの名前と一致する必要があります。ただし、特定のサブスクリプションに対して送信されるコレクションは、サブスクリプション名とは何の関係もありません。実際、1つの出版物で複数のカーソルを送信することができます またはさまざまな出版物の1つのコレクション またはパブリケーションごとに複数のサブスクリプション 、クライアントで1つとしてマージされたように見えます。サーバーとクライアントで異なるコレクション名を使用することもできます。続きを読む...
さまざまなケースを確認しましょう:
-
シンプルなサブスクリプションモデル 。これは、Meteorの簡単なデモで通常見られるものです。
クライアントとサーバーで
Posts = new Meteor.Collection("posts");
サーバーのみ:
Meteor.publish("postsPub", function() { return Posts.find() });
クライアントのみ:
Meteor.subscribe("postsPub")
これにより、
Posts
が同期されます コレクション(posts
という名前です データベース内)postsPub
というパブリケーションを使用 。 -
1つの出版物に複数のコレクション 。配列を使用して、1つのパブリケーションに対して複数のカーソルを送信できます。
クライアントとサーバーの場合:
Posts = new Meteor.Collection("posts"); Comments = new Meteor.Collection("comments");
サーバーのみ:
Meteor.publish("postsAndComments", function() { return [ Posts.find(), Comments.find() ]; });
クライアントのみ:
Meteor.subscribe("postsAndComments");
これにより、
Posts
が同期されます コレクションとComments
postsAndComments
と呼ばれる単一のパブリケーションを使用したコレクション 。このタイプのパブリケーションは、リレーショナルデータに最適です。たとえば、特定の投稿とそれらの投稿にのみ関連付けられたコメントのみを公開したい場合があります。 これらのカーソルを自動的に作成できるパッケージを参照してください。 。 -
1つのコレクションに複数の出版物 。複数のパブリケーションを使用して、Meteorによって自動的にマージされる単一のコレクションのデータのさまざまなスライスを送信できます。
サーバーとクライアント:
Posts = new Meteor.Collection("posts");
サーバーのみ:
Meteor.publish("top10Posts", function() { return Posts.find({}, { sort: {comments: -1}, limit: 10 }); }); Meteor.publish("newest10Posts", function() { return Posts.find({}, { sort: {timestamp: -1}, limit: 10 }); });
クライアントのみ:
Meteor.subscribe("top10Posts"); Meteor.subscribe("newest10Posts");
これにより、コメントが最も多い10件の投稿と、サイトの最新の10件の投稿の両方がユーザーにプッシュされ、両方のデータセットが1つの
Posts
にマージされます。 コレクション。最新の投稿の1つがコメントが最も多い投稿でもある場合、またはその逆の場合は、Posts
コレクションには20未満のアイテムが含まれます。これは、Meteorのデータモデルを使用して、詳細を自分で実装しなくても強力なデータマージ操作を実行できるようにする方法の例です。 -
パブリケーションごとに複数のサブスクリプション。 異なる引数を使用して、同じパブリケーションから複数のデータセットを取得できます。
サーバーとクライアント:
Posts = new Meteor.Collection("posts");
サーバーのみ:
Meteor.publish("postsByUser", function(user) { return Posts.find({ userId: user }); });
クライアントのみ:
Meteor.subscribe("postsByUser", "fooUser"); Meteor.subscribe("postsByUser", "barUser");
これにより、
fooUser
による投稿が発生します およびbarUser
両方ともposts
に表示されます コレクション。このモデルは、データのさまざまなスライスを調べ、動的に更新される可能性のあるいくつかの異なる計算がある場合に便利です。Deps.autorun(...)
内でサブスクライブする場合は注意してください 、Meteorはstop()
を呼び出します 同じ名前の以前のサブスクリプションハンドルで自動的に、ただしこれらのサブスクリプションをautorun
の外部で使用している場合 自分で止める必要があります。現在のところ、autorun
内で同じ名前の2つのサブスクリプションを実行することはできません Meteorはそれらを区別できないため、計算。 -
パブリケーションに任意のデータをプッシュします。 サーバーとクライアントで同じコレクション名を必要としないように、パブリケーションを完全にカスタマイズできます。実際、サーバーは、コレクションにまったく裏付けられていないデータを公開できます。これを行うには、公開機能用のAPIを使用できます 。
サーバーのみ:
Posts = new Meteor.Collection("posts"); Meteor.publish("newPostsPub", function() { var sub = this; var subHandle = null; subHandle = Posts.find({}, { sort: {timestamp: -1}, limit: 10 }) .observeChanges({ added: function(id, fields) { sub.added("newposts", id, fields); }, changed: function(id, fields) { sub.changed("newposts", id, fields); }, removed: function(id) { sub.removed("newposts", id); } }); sub.ready(); sub.onStop(function() { subHandle.stop(); }) });
クライアントのみ:
NewPosts = new Meteor.Collection("newposts"); Meteor.subscribe("newPostsPub");
これにより、
Posts
からの最新の10件の投稿が同期されます サーバー上のコレクション(posts
と呼ばれます データベース内)NewPosts
クライアント上のコレクション(newposts
と呼ばれます minimongoで)newPostsPub
と呼ばれるパブリケーション/サブスクリプションを使用します 。observeChanges
に注意してくださいobserve
とは異なります 、他にもたくさんのことができます。コードは複雑に見えますが、公開関数内にカーソルを戻すと、これは基本的にMeteorが舞台裏で生成しているコードです。この方法でパブリケーションを作成すると、クライアントに送信されるものと送信されないものをより細かく制御できます。ただし、
observe
を手動でオフにする必要があるため注意してください。 サブスクリプションの準備ができたら、ハンドルとマークを付けます。詳細については、MattDebergalisによるこのプロセスの説明を参照してください。 (ただし、その投稿は古くなっています)。もちろん、これを上記の他の部分と組み合わせて、非常に微妙で複雑な出版物を入手できる可能性があります。
エッセイで申し訳ありません:-)しかし、多くの人がこれについて混乱します、そして私はすべてのケースを説明するのに役立つでしょうが。