2017-02-08 2 views
1

Я новичок в MongoDB, и я создаю простой db с 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) и Боб (_id : 22222), и поэтому я отправляю POST в/api/games с телом { users: [ 11111, 22222 ] }

Теперь, мой вопрос заключается в том, что для создания новой игры для создания новой игры также необходимо создать 2 игрока. Каков наилучший способ достичь этого?

В методе Game.create() я должен получить данные, создать и сохранить игроков, создать игру, назначить игроков, сохранить игру, а также обновить пользователей и добавить игровые идентификаторы?

Я также читал о промежуточном программном обеспечении Mongoose, где вы можете установить определенные функции, которые будут выполняться до или после некоторых операций. Так что, может быть, это лучше: pre function before Game.create, чтобы создать игроков post function before Game.create, чтобы обновить пользователей

Это последнее кажется чище. Каков наилучший способ? Может быть, еще один, который я не рассматривал?

Благодаря

ответ

1

Я хотел бы предложить вам, используя почту и заранее функцию, определенную в мангустах ЕГО. Они довольно просты и удобны в использовании. Вероятно, это решит вашу проблему.

Вот персональный пример проблемы, которая у нас была; В нашем случае нам пришлось назначить 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(); 
    })   
}); 

Мое предложение состоит в том, что перед тем, как создать игру, вы можете найти пользователей и добавить ссылку на игру. Если бы я был вами, я бы использовал запрос findAndModify mongodb, чтобы найти пользователей или создать, если они еще не существуют.

Смежные вопросы