如果现有文档不存在,我尝试了两种方法来覆盖它。
此代码无效,并在每次更新时抛出此错误:
错误: *将更新应用于文档{_id:ObjectId(' ***'),...}后,(不可变)字段&# 39; _id'被发现被改为_id:ObjectId(' *** 78')" *
exports.loginUser = function (req, res) {
var newUser = new userModel(req.body);
userModel.findOneAndUpdate({email: req.body.email}, newUser ,{ new: true,
upsert:true, setDefaultsOnInsert: true }, function (err, userUpdate) {
return res.json(userUpdate);
}
直接插入效果良好的请求body
。但我不想这样做,因为body
可能有垃圾:
exports.loginUser = function (req, res) {
var newUser = new userModel(req.body);
userModel.findOneAndUpdate({email: req.body.email}, req.body ,{ new: true,
upsert:true, setDefaultsOnInsert: true }, function (err, userUpdate) {
return res.json(userUpdate);
}
所以有人可以建议我如何使用模型而不是请求体来findOneAndUpdate
。
答案 0 :(得分:1)
使用.update()方法:
var newUser = new userModel(req.body);
newUser.update(newUser, { upsert:true, setDefaultsOnInsert: true }, function (err) {
if (err) {
console.log(err);
return res.json('Cannot save user');
}
res.json(newUser);
});
无需使用new:true
选项,因为newUser
将始终包含更新或插入的文档
答案 1 :(得分:0)
您不应该使用new
因为这会创建一个新的_id
,所以您应该这样做:
exports.loginUser = function(req, res) {
var newUser = req.body; // here remove the new
userModel.findOneAndUpdate(
{ email: req.body.email },
newUser,
{ new: true, upsert: true, setDefaultsOnInsert: true },
function(err, userUpdate) {
return res.json(userUpdate);
}
);
}