2017-02-08 38 views
1

私はMongoDBを使い慣れていません。ユーザー、ゲーム、プレーヤーのモデルでMongooseを使って簡単なデータベースを作成しています。MongoDB Mongooseネストされたオブジェクトを持つオブジェクトを保存する

したがって、1人のユーザーにはゲームが1つも数多く含まれていません。すべてのゲームはプレイヤーに任され、各プレイヤーはユーザーを参照します。

const UserSchema = new Schema({ 
    name: String, 
    games: [{ 
    type: Schema.Types.ObjectId, 
    ref: 'game' 
    }] 
}); 

const GameSchema = new Schema({ 
    mode: Number, 
    players: { 
    type: [{ 
     type: Schema.Types.ObjectId, 
     ref: 'player' 
    }], 
    required: true 
    } 
}); 

const PlayerSchema = new Schema({ 
    order: Number, 
    isWinner: Boolean, 
    user: { 
    type: Schema.Types.ObjectId, 
    ref: 'user', 
    required: true 
    } 
}); 

だから、今フロントエンドで、私は、ユーザージョー(_id:11111)のための新しいゲームを作成するために、バックエンドへの嘆願書を送りたい:とボブ(_idこのように(私は明確にするためのスキーマを簡素化) :22222)ので、私はボディに/ api/gamesにPOSTを送ります。{ users: [ 11111, 22222 ] }

私の質問は、バックエンドで新しいゲームを作成するために、2人のプレイヤーを作成することです。これを達成する最良の方法は何ですか?

Game.create()メソッドでは、データの取得、プレーヤの作成と保存、ゲームの作成、プレーヤの割り当て、ゲームの保存、ユーザーの更新とゲームIDの追加を行いますか?

また、いくつかの操作の前後に実行される特定の機能を設定できるMongooseミドルウェアについても読んでいます。だから、多分それは良いでしょう:Game.create前 事前機能、Game.create前に選手 ポスト関数を作成するには、ユーザーに

を更新するには、この最後のものはきれいそうです。 どのような方法が最適ですか?私が考えていない別のものかもしれない?

おかげ

答えて

1

私はマングースミドルウェアで定義されたポストとの事前の機能を使用して、あなたをお勧めします。彼らはかなり簡単で使いやすいです。これはおそらくあなたの問題を解決するでしょう。

ここには私たちが持っていた問題の個人的な例があります。私たちの場合、データベースのシーケンスからuserIdを割り当てる必要がありました。私の提案は、あなたがゲームを作成する前に、あなたがユーザーを検索し、ゲームへの参照を追加することができるということです

var UserSchema = new Schema({ 
username: { type: String, required: true, unique: true }, 
id: { type: String }, 
... 
}); 

UserSchema.pre('save', function(next) { 
    let doc = this;  
    let id = 'userSeq'  

Sequence.findByIdAndUpdate(id, { $inc : {nextSId : 1} }, function(error,data) {   
    if(error) 
     next(error)    
    doc.id = data.nextSId-1; 
    next(); 
    })   
}); 

:私たちは、次のコードを使用していました。私の場合は、mongodbのfindAndModifyクエリを使用してユーザーを検索したり、ユーザーがまだ存在しない場合は作成したりします。

関連する問題