使用嵌套对象

时间:2017-02-08 14:33:10

标签: mongodb mongoose mongoose-middleware

我是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之前发布功能,以更新用户

这最后一个看起来更干净。 什么是最好的方式?也许还有一个我没想过的?

由于

1 个答案:

答案 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查询来查找用户或创建它们是否尚不存在。