2016-11-30 13 views
1

私はゲームを作っています。選手はリーグを組んで競合する予測をする。リーグは次のようになります。各プレイヤーのためにMeteor/Mongodb - 配列、サブ文書、重複サブスクリプション

{ leagueName: "Premier League", 
players:[ 
     {name: "Goodie", secretPrediction: "abc"}, 
     {name: "Baddie", secretPrediction: "def"} 
     ] } 

、私はクライアントにリーグ内のすべての選手の名前を公表する必要がありますが、だけで、自分の秘密の予測。グッディがログインしているのであれば、上から、ミニモンゴ上の文書は次のようになります - 全体のリーグの文書を取得するために、1以外のすべての秘密の予測、および1を除く

{ leagueName: "Premier League", 
    players:[ 
      {name: "Goodie", secretPrediction: "abc"}, 
      {name: "Baddie"} 
      ] } 

これを行うために、私は2つの出版物を持っています現在のプレーヤーのサブ文書をプレーヤーの配列に取得するには、彼女の秘密の予測が含まれています。私の出版物は、次のとおりです。

// Publish whole players array excluding secretPrediction 
Leagues.find({"players.name": "Goodie"}, {fields: {"players.secretPrediction": 0}}) 

// Publish the whole Goodie item in the players array and nothing else 
Leagues.find({"players.name": "Goodie"}, {fields: {players: {$elemMatch: {name: "Goodie"}}}}) 

問題は、私は両方上記公報に加入したときに、私は私がしたい文書を取得しないということです - 秘密の予測が偶数秒の出版物で除外されています。 (期待通りの出版物が振る舞う自分で、それは私が両方に加入したときのみです。)

今、私は2つの出版物がダウンし、クライアント

の「合併」する必要があることをthis answerから理解トップレベルのフィールドのレベルMeteorは、サブスクリプションが重複するように、ドキュメント間の組合を実行するように注意します。異なるトップレベルのフィールドをクライアントの作業に並べて発行する機能を公開し、クライアントでは、コレクションは2つのフィールドセットの和集合になります。

だから私は、主に2つの質問を持っている(とも/ここまでそれを作るためのおかげでやった!):私はトップレベルのフィールドを扱っていないよので

  1. は、文書の労働組合が起きていません?これを回避する方法はありますか?
  2. 私はこれについて完全に間違った方法ですか?私が望む結果を得る良い方法はありますか?
+1

1.正しい。 2.クライアントのみの「仮想」コレクションに公開しようとする可能性があります。 – MasterAM

答えて

2

たとえば、単一のクエリを使用できるようにデータドキュメントを並べ替えることができますか?

{ leagueName: "Premier League", 
players:[ 
     {name: "Goodie"}, 
     {name: "Baddie"} 
     ] 
playerPredictions:[ 
     {name: "Goodie", secretPrediction: "abc"}, 
     {name: "Baddie", secretPrediction: "def"} 
     ] 
} 

このようにして、単一のクエリですべてのプレイヤーを返すことができ、与えられた人物のplayerPredictionだけを返すことができます。

+0

私はそれが私が必要とする結果を得るための最も簡単で素早い方法だと思うので、これを答えとして受け入れる – rubie

3
  1. はい、流星のマージ複数のサブスクリプションは、それが流星のドキュメントに記載されている、トップレベルのフィールドで動作します:Meteor.subscribe

  2. 私は間違った方向に向かっていると言うことはできません
  3. 、この実際にあなたの状況に応じて、どのような機能を手助けしたいのですか?自分のことを話すだけで、私は上記のコレクションを2つの別々のコレクションに分離します。プレイヤーは多くのリーグに加わる可能性があり、リーグには多くのプレーヤーがいるかもしれないので、彼らの関係はmany-to-many (n-n)です。関係のこの種のために、我々は2つのコレクションにそれらを分割し、だからあなたの場合には、私が持っているだろう彼らの関係

を反映するためにassociative tableを使用する必要があります。

リーグコレクション:

[{ 
    _id: 'league1', 
    name: 'League 1', 
    // ... 
}] 

プレイヤーコレクション:

[{ 
    _id: 'player1', 
    name: 'Player 1', 
    // ... 
}] 

リーグ2プレーヤーコレクション:

[{ 
    _id: 'league1palyer1', 
    playerId: 'player1', 
    leagueId: 'league1', 
    secretPrediction: 'abc', 
    // ... 
}] 
+0

ドキュメントの良い点 - 私はそのコメントを見ませんでした。そして、 "将来のリリースでこの制限を解除したいと考えています。" - うまくいけばすぐに... – rubie

関連する問題