1
votes

I'm new to MongoDB and I'm creating a simple db with Mongoose with the following models: User, Game and Players.

So, one user contains none or many games. Every game has to players, and each player refers to a user. Like this (I simplified the schemas for clarity):

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
  }
});

So, now in the frontend I want to send a petition to the backend to create a new game for users Joe (_id:11111) and Bob (_id:22222) and so I send a POST to /api/games with the body { users: [ 11111, 22222 ] }

Now my question is, for the backend to create a new game, it also has to create 2 players. What's the best way to achieve this?

In the Game.create() method, shall I retrieve the data, create and save the players, create the game, assign the players, save the game, and also update the users and add the game ids?

I also read about Mongoose middleware, where you can set certain functions to be executed before or after some operations. So maybe it's better: pre function before Game.create, to create the players post function before Game.create, to update the users

This last one seems cleaner. What's the best way? Maybe another one I have not considered?

Thanks

1

1 Answers

1
votes

I would suggest you using the post and pre functions defined in the mongoose middleware. They're pretty straightforward and neat to use. It will probably solve your problem.

Here is a personal example of a problem we had; In our case, we had to assign a userId from a sequence in the database. We used the following code:

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();
  })        
});

My suggestion is that before you create the game, you can search for the users and add a reference to the game. If I were you, I would use the findAndModify query of mongodb to find the users or create if they do not exist yet.