1

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 Answer 1

1

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.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.