обновить в pre save hook - PullRequest
0 голосов
/ 10 июня 2018

У меня есть такая схема пользователя

const userSchema = new Schema({
  username: {
    type: String,
    unique: true,
    required: true,
  }, 
  cardIds: [{
    type: Schema.Types.ObjectId,
    ref: 'cards',
  }],
})
mongoose.model('users', userSchema)

Я пытаюсь сделать две вещи в хуке предварительного сохранения для пользователя: во-первых, сохранение каждой карты с идентификатором пользователя, а во-вторых, добавление cardIds Пользователю.Мой код:

const Card = mongoose.model('cards')

userSchema.pre('save', function (next) {
  if (this.cardIds.length === 0) {
    cardList.forEach(async card => {
      const newCard = await new Card({ ...card, user: this })
      this.cardIds.push(newCard) // this is not working
      newCard.save() // this is working
    })
  }
  next()
})

Это добавит каждую карту в коллекцию cards с правильным user._id, однако у каждого пользователя все равно будет пустой массив для cardIds.

Способ сохранения пользователя (без удобства обработки ошибок / проверки):

app.post('/users/new', async (req, res) => {
  const newUser = await new User({ username: req.body.username })
  await newUser.save()
  return res.json({ message: 'User created successfully' })
})

1 Ответ

0 голосов
/ 10 июня 2018

Это, в основном, код javascript this.cardIds.push(newCard) для отправки элемента в массив, но он ничего не делает с вашей базой данных mongo ...

Поэтому, чтобы обновить массив в mongodb, вынужно использовать $ push оператор

userSchema.pre('save', function (next) {
  if (this.cardIds.length === 0) {
    cardList.forEach(async card => {
      const newCard = new Card({ ...card, user: this })
      const saveNewCard = await newCard.save() // this is working
      const updateUser = await User.update(
        { _id: this._id },
        { $push: { cardIds: saveNewCard._id }}
      )
    })
  }
  next()
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...