在预保存挂钩中更新

时间:2018-06-10 13:49:14

标签: node.js mongodb express mongoose

我有一个像这样的用户架构

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

我正在尝试在用户的预保存挂钩中执行两项操作:首先,使用用户ID保存每张卡,然后将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 :(得分:1)

这基本上是一个将元素推送到数组的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()
})