1

我是 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) 创建一个新游戏,所以我向 /api/games 发送一个带有正文的 POST{ users: [ 11111, 22222 ] }

现在我的问题是,后端要创建一个新游戏,它还必须创建 2 个玩家。实现这一目标的最佳方法是什么?

在 Game.create() 方法中,我是否应该检索数据、创建和保存玩家、创建游戏、分配玩家、保存游戏以及更新用户和添加游戏 ID?

我还阅读了有关 Mongoose 中间件的信息,您可以在其中设置在某些操作之前或之后执行的某些功能。所以也许更好:在 Game.create 之前的 pre 函数,在 Game.create 之前创建玩家 post 函数,更新用户

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

谢谢

4

1 回答 1

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 查询来查找用户,或者如果他们不存在则创建。

于 2017-02-09T06:48:24.320 回答