sql >> データベース >  >> NoSQL >> MongoDB

Meteor:コレクション、変数、パブリケーション、サブスクリプションの名前の違いは?

    Meteorをプログラミングするときに扱う必要のあるさまざまな名前を区別しましょう:

    • 変数名Posts = new Meteor.Collection(...)など 。これらは、コードがこの変数にアクセスする方法を知っている場合にのみ使用されます。 Meteorはそれが何であるかを知らないか、気にしませんが、慣例は資本化することです。
    • コレクション名new Meteor.Collection("posts")など 。これは、MongoDBコレクション(サーバー上)またはminimongoコレクション(クライアント上)の名前にマップされます。
    • 出版物とサブスクリプションの名前Meteor.publish("foo", ...)で使用されます またはMeteor.subscribe("foo") 。クライアントがサーバー上の一部のデータをサブスクライブするには、これらが一致している必要があります。

    Meteorデータモデルで一致させる必要があるものは2つあります。

    1. 出版物の名前とそれに対応する購読
    2. (通常) デフォルトのコレクションモデルを使用している場合は、クライアントとサーバー上のコレクションの名前

    サブスクリプション名は、常にパブリケーションの名前と一致する必要があります。ただし、特定のサブスクリプションに対して送信されるコレクションは、サブスクリプション名とは何の関係もありません。実際、1つの出版物で複数のカーソルを送信することができます またはさまざまな出版物の1つのコレクション またはパブリケーションごとに複数のサブスクリプション 、クライアントで1つとしてマージされたように見えます。サーバーとクライアントで異なるコレクション名を使用することもできます。続きを読む...

    さまざまなケースを確認しましょう:

    1. シンプルなサブスクリプションモデル 。これは、Meteorの簡単なデモで通常見られるものです。

      クライアントとサーバーで

      Posts = new Meteor.Collection("posts");
      

      サーバーのみ:

      Meteor.publish("postsPub", function() { 
          return Posts.find() 
      });
      

      クライアントのみ:

      Meteor.subscribe("postsPub")
      

      これにより、Postsが同期されます コレクション(postsという名前です データベース内)postsPubというパブリケーションを使用 。

    2. 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と呼ばれる単一のパブリケーションを使用したコレクション 。このタイプのパブリケーションは、リレーショナルデータに最適です。たとえば、特定の投稿とそれらの投稿にのみ関連付けられたコメントのみを公開したい場合があります。 これらのカーソルを自動的に作成できるパッケージを参照してください。 。

    3. 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のデータモデルを使用して、詳細を自分で実装しなくても強力なデータマージ操作を実行できるようにする方法の例です。

    4. パブリケーションごとに複数のサブスクリプション。 異なる引数を使用して、同じパブリケーションから複数のデータセットを取得できます。

      サーバーとクライアント:

      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はそれらを区別できないため、計算。

    5. パブリケーションに任意のデータをプッシュします。 サーバーとクライアントで同じコレクション名を必要としないように、パブリケーションを完全にカスタマイズできます。実際、サーバーは、コレクションにまったく裏付けられていないデータを公開できます。これを行うには、公開機能用の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によるこのプロセスの説明を参照してください。 (ただし、その投稿は古くなっています)。もちろん、これを上記の他の部分と組み合わせて、非常に微妙で複雑な出版物を入手できる可能性があります。

    エッセイで申し訳ありません:-)しかし、多くの人がこれについて混乱します、そして私はすべてのケースを説明するのに役立つでしょうが。



    1. LaravelにWebソケットを実装したい

    2. エラー:mongodbに接続しているWindowsでUNIXソケットがサポートされていません

    3. プレーンな文字列の代わりにObjectIdを使用する利点は何ですか?

    4. TwitterのストリーミングAPIからツイートを消費してmongodbに保存するにはどうすればよいですか?