Mongoose通过id更新数组中的项

时间:2018-02-12 08:13:01

标签: node.js mongodb mongoose

在我使用mongoose的节点js项目中,我试图更新文档中的数组项。
我有一个users架构,里面有一个notifications数组。每个用户都有_id,每个通知项都有_id

如何更新通知,用户ID和通知ID?

USER SCHEMA:

const schema = mongoose.Schema({
  notifications: [{
    id: { type: mongoose.Schema.ObjectId },
    title: { type: String },
    body: { type: String },
    isRead: { type: Boolean, default: false },
    date: { type: Date }
  }],
  token: { type: String },
  isActive: { type: Boolean, default: false }
}, { timestamps: {} }) 

这是我迄今为止所尝试过的:

exports.updateNotification = (req, res) => {

  // Note: in req.params I receive id(for user id) and notificationId.

  UserModel.findByIdAndUpdate(req.params.id, { $set: { notifications: req.body } }, { safe: true, upsert: true, new: true })
    .then((result) => res.status(201).json({
      success: true,
      message: res.__('success.add'),
      user: result
    }))
    .catch(err => errorHandler.handle(err, res))
}

方法findByIdAndUpdate我已将其用于更新用户,但我不知道如何根据ID修改通知来更新用户。

2 个答案:

答案 0 :(得分:1)

UserModel.update({'_id':1,'notifications.id': 2}, {'$set': {
    'notifications.$.title': 'updated title',
    'notifications.$.body': 'updated body'
}}, function(err) { ...}

Haven未经测试,但这应该有效。

答案 1 :(得分:1)

尝试使用$elemMatch

UserModel.findOneAndUpdate({_id: 1, notifications: {$elemMatch: {id: 2}}},
                           {$set: {'notifications.$.title': req.body.title,
                                   'notifications.$.body': req.body.body,}}, // list fields you like to change
                           {'new': true, 'safe': true, 'upsert': true});