そのように定義されたマルチプレイヤーゲームがあるとしましょう:
var GameSchema = new Schema({
players : {type : [Schema.ObjectID], ref : 'User', required : true}
});
各ゲームには独自のスコアがあることを知っているので、各ユーザーのスコアを保存するための最良の方法は何でしょうか。ここにいくつかのオプションがあります:
属性の個別の配列を追加する
var GameSchema = new Schema({ players : {type : [Schema.ObjectID], ref : 'User', required : true} ,scores : {type : [Number]} });
関係を作成する唯一の方法は、インデックス位置を参照することです。良い考えではないようです。
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を呼び出さなければならないことも正しくないようです。
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を呼び出すことができるように、この「マップ」ユーザーをプレーヤーに想定しました。残念ながら、上記のコードは機能しません。
ベストプラクティスは何ですか?他の選択肢はありますか?
ありがとう!