如何在猫鼬中同时更新对象并推入数组

Joh*_*ohn 5 mongoose mongodb node.js

我有一个架构如下

var FriendsSchema = new Schema({
  email: {
    type: String
  }
  firstName: String,
  lastName:  String,
  previousEmails:[{
    email:{
      type:String
    }
  }],
  createdDate:{
    type:Date,
    default:Date.now
  },
  updatedDate:{
    type:Date,
    default:Date.now
  }
});
Run Code Online (Sandbox Code Playgroud)

我想做的是,在更新时,如果“电子邮件”发生更改,我想将“电子邮件”字段更新为传入的新值,并将当前“电子邮件”值推送到“上一个电子邮件”中' 大批。

我可以通过以下两个步骤完成此操作:1)按 id 更新对象,并设置除数组“previousEmails”之外的所有字段2)如果对象的“电子邮件”字段已更改,则将旧值推入“ previousEmails 数组。

我的问题是,是否可以一步完成此操作?所以我有 $push 和 $set 作为我的查询的一部分?

Joh*_*ohn 6

虽然上面的答案很接近。我通过执行以下操作使其工作,该操作很接近,但还添加了 $set,上面未包含

Friend.findOneAndUpdate({_id: req.body.id}, {$set:{email: req.body.email}, $push: { previousEmails: this.email } }
}, {new: true}, function(err, friend){
    if (err){
        console.log(err); 
    } 
});
Run Code Online (Sandbox Code Playgroud)