2016-06-24 11 views
0

私はにgamesコレクションを持っています。各文書は、ゲームを実行するために必要なデータを保持する責任があります。私の文書構造は次のとおりです配列要素の特定の特性を返す - MongoDB /流星

{ 
    _id: 'xxx', 
    players: [ 
      user:{} // Meteor.users object 
      hand:[] //array 
      scores:[] 
      calls:[] 
     ], 
    table:[], 
    status: 'some string' 


} 

これは基本的にマイカードゲーム(コールブリッジ)の構造です。今すぐ公開したいのは、プレーヤーがhandのデータを他のプレーヤーのuser, scores, callsフィールドと共にブラウザ(ミニゴン)に持たせることです。だから、ブラウザに行くサブスクリプションはこのようになります。

{ 
    _id: 'xxx', 
    players: [ 
      { 
       user:{} // Meteor.users object 
       hand:[] //array 
       scores:[] 
       calls:[] 
      }, 
      { 
       user:{} // Meteor.users object 
       scores:[] 
       calls:[] 
      }, 
      // 2 more player's data, similar to 2nd player's data 

     ], 
    table:[], 
    status: 'some string' 


} 

players.userオブジェクトは、ユーザを区別_id性質を有しています。流星のパブリッシュ方法では、私たちはthis.userIdにアクセスして、データを要求しているuserIdを返します。つまり、その_idthis.userIdと一致するそのユーザーの入れ子になったhand配列を必要とします。私はこの説明がより正確な解決策を書くのに役立つことを願っています。

答えて

0

配列要素から特定のプロパティを取得するには、以下のように記述します。db.games.aggregate([{$ unwind: "$ players"}、{$ projects:{"players.scores" 1}}]);これは私達にIDとスコアフィールドだけを与えます

+0

私のケースでは集計は機能しません。私は流星のための検索のカーソルを返す必要がありますあなたの提案に –

1

あなたの行う必要があるのは、あなたのコレクションを "正規化"することです。 Gamesコレクションのプレーヤーフィールドで手、スコア、コールをする代わりに、そのデータを保持するための別のコレクションを作成し、ユーザー_idを「キー」として使用して、プレーヤーフィールドのユーザー_idのみを参照するだけです。例えば。

{ 
    _id: 'xxx', 
    players: [userId], 
    table:[], 
    status: 'some string' 


} 

ですから、データ

を要求して、現在のユーザーのコンテンツを取得したい場合はゲームコレクション内のその後

{ 
_id: '2wiowew', 
userId: 1, 
hand:[], 
scores:[], 
calls:[], 
} 

GameStatsコレクションを作成します(または、あなたがしたい方の名前)

GameStats.find({userId: this.userId}).hand 

編集

これらは特定の状況で非正規化を促しますが、上記のコードでは配列は機能しません。次に、mongoDBのドキュメントの例を示します。

{ 
_id: ObjectId("5099803df3f4948bd2f98391"), 
name: { first: "Alan", last: "Turing" }, 
birth: new Date('Jun 23, 1912'), 
death: new Date('Jun 07, 1954'), 
contribs: [ "Turing machine", "Turing test", "Turingery" ], 
views : NumberLong(1250000) 
} 
+0

おかげで公開しています。 MongoDBが非正規化を奨励するので、私は私の構造とのマッチよりも答えを探しています。 :) –

関連する問題