0

そのように定義されたマルチプレイヤーゲームがあるとしましょう:

    var GameSchema = new Schema({
      players : {type : [Schema.ObjectID], ref : 'User', required : true}
    });

各ゲームには独自のスコアがあることを知っているので、各ユーザーのスコアを保存するための最良の方法は何でしょうか。ここにいくつかのオプションがあります:

  1. 属性の個別の配列を追加する

    var GameSchema = new Schema({
      players : {type : [Schema.ObjectID], ref : 'User', required : true}
     ,scores  : {type : [Number]}
    });
    

    関係を作成する唯一の方法は、インデックス位置を参照することです。良い考えではないようです。

  2. PlayerEmbeddedDocの追加

    var PlayerSchema = new Schema({
      user  : {type : [Schema.ObjectID], ref : 'User', required : true}
     ,score : {type : Number, default : 0 }
    });
    
    var GameSchema = new Schema({
      players : {type : [PlayerSchema], required : true}
    });
    

    このアプローチでの私の主な問題は、ユーザー情報が1レベル深く埋もれてしまうことです。game.playersの代わりにgame.players.userを呼び出さなければならないことも正しくないようです。

  3. DBRrefを組み込みドキュメントとして拡張しますか?

    理想的には、私はできるはずです

    var PlayerSchema = new Schema({
      _id  : {type : [Schema.ObjectID], ref : 'User'}
     ,score : {type : Number, default : 0 }
    });
    
    var GameSchema = new Schema({
      players : {type : [PlayerSchema], required : true}
    });
    

    このアプローチは、ユーザーがPlayerのIDとして直接参照されることを除いて、基本的に#2に似ています。game.players [player_id] .scoreを呼び出すことができるように、この「マップ」ユーザーをプレーヤーに想定しました。残念ながら、上記のコードは機能しません。

ベストプラクティスは何ですか?他の選択肢はありますか?

ありがとう!

4

1 に答える 1

1

id役立つMongooseArraysのメソッドがあります。この要点は実例です。完全にクリーンではありませんが、_idを分離しておく必要があります。

フィールドに入力すると、必要なもの(game.players[player_id].score)は実際には意味がありません。クエリの結果に完全に置き換えられます。

于 2012-06-19T17:35:22.400 に答える