我是MongoDB的新手,我正在使用以下模型创建一个包含Mongoose的简单数据库:用户,游戏和玩家。
因此,一个用户不包含任何游戏。每个游戏都有玩家,每个玩家都指向一个用户。像这样(为了清晰起见,我简化了模式):
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
}
});
所以,现在在前端,我想向后端发送一份请愿书,为用户Joe(_id:11111)和Bob(_id:22222)创建一个新游戏,所以我发送一个POST到/ api /游戏正文{ users: [ 11111, 22222 ] }
现在我的问题是,对于后端创建新游戏,它还必须创建2个玩家。实现这一目标的最佳方法是什么?
在Game.create()方法中,我应该检索数据,创建和保存玩家,创建游戏,分配玩家,保存游戏,还更新用户并添加游戏ID?
我还阅读了Mongoose中间件,您可以在其中设置某些操作之前或之后要执行的某些功能。所以也许它会更好: Game.create之前的pre函数,用于创建玩家 在Game.create之前发布功能,以更新用户
这最后一个看起来更干净。 什么是最好的方式?也许还有一个我没想过的?
由于
答案 0 :(得分:1)
我建议你使用mongoose中间件中定义的post和pre函数。它们非常简单易用。它可能会解决你的问题。
这是我们遇到的问题的个人例子;在我们的例子中,我们必须从数据库中的序列中分配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查询来查找用户或创建它们是否尚不存在。