在同一个findByIdAndUpdate上,使用$ push和$ pull

在下面的代码中我试图findByIdAndUpdate和更新我想添加到两个objectIds数组,并从另一个拉。 但是,只有第一个更新命令正在执行。 所以$push: {Group1: groupId, Group2: groupId}正在执行,但$pull: {Group3: groupId}不是。

有没有办法使两个操作一起工作?

 User.findByIdAndUpdate( userId, { $push: {Group1: groupId, Group2: groupId}, $pull: {Group3: groupId}, }, {'new': true, 'multi':true}, function (err, user) { if (err) console.log(err); else { res.json({ success: true, message: 'Success.' }); } } ); 

架构

 var mongoose = require('mongoose'); var Schema = mongoose.Schema; var bcrypt = require('bcrypt-nodejs'); var ObjectId = Schema.Types.ObjectId; //user schema var UserSchema = new Schema({ username: {type: String, required: true, index:{unique:true}}, phoneNumber: {type: String, required: true, index:{unique:true}}, password: {type: String, required: true, select: false}, name: String, Group1: [{ type : ObjectId, ref: 'Group' }], Group2: [{ type : ObjectId, ref: 'Group' }], Group3: [{ type : ObjectId, ref: 'Group' }], }); module.exports = mongoose.model('User', UserSchema); 

这里是用户对象的JSON表示

 { "_id": ObjectId('564a4a24f63d409f526659c4'), "password": "$2a$10$YYEdr4kavrB2w8dRWHqWC.hAUd1pRzKM6YQt9iLtkrLDk0cRg24Wa", "phoneNumber": "222", "username": "222", "Group1": [ ObjectId('564a2ac4e982c8bb5122a96e') ], "Group2": [], "Group3": [], "__v": 0 } 

当我执行我的代码时,json对象看起来像

  { "_id": ObjectId('564a4a24f63d409f526659c4'), "password": "$2a$10$YYEdr4kavrB2w8dRWHqWC.hAUd1pRzKM6YQt9iLtkrLDk0cRg24Wa", "phoneNumber": "222", "username": "222", "Group1": [ ObjectId('564a2ac4e982c8bb5122a96e') ], "Group2": [ ObjectId('564a2acae982c8bb5122a970') ], "Group3": [ ObjectId('564a2acae982c8bb5122a970') ], "__v": 0 } 

所以Group3中的objectID不会被删除。 我在这个问题上的想法是,我没有正确使用正确的findByIdAndUpdate在同一时间进行拉和推。 这使我倾向于使用findById,然后在callback中进行更新。 在使用findByIdAndUpdate的时候会有一个缺点吗?