2017-02-08 72 views
1

我是MongoDB的新手,我正在用Mongoose创建一个简单的数据库,并使用以下模型:用户,游戏和玩家。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 
    } 
}); 

所以,现在在前台我要了一份请愿书发送到后端来创建一个新的游戏,为用户乔(_id:11111)和Bob(_id :22222),所以我发送POST到/ api /游戏与身体{ users: [ 11111, 22222 ] }

现在我的问题是,为后端创建一个新的游戏,它也必须创建2名球员。达到此目的的最佳方式是什么?

在Game.create()方法中,我应该检索数据,创建并保存玩家,创建游戏,分配玩家,保存游戏以及更新用户并添加游戏id。

我还阅读了关于Mongoose中间件,您可以在其中设置某些功能在某些操作之前或之后执行。所以也许它会更好: 在Game.create之前的预先功能,在Game.create之前创建球员 之后的功能,以更新用户

最后一个看起来更干净。 最好的方法是什么?也许另一个我没有考虑过?

谢谢

回答

1

我建议你使用猫鼬中间件中定义的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查询来查找用户或创建它们,如果它们还不存在。