使用mongoose中的模型进行FindOneAndUpdate

时间:2018-02-05 15:33:26

标签: node.js mongodb express mongoose

如果现有文档不存在,我尝试了两种方法来覆盖它。

第一路

此代码无效,并在每次更新时抛出此错误:

  

错误: *将更新应用于文档{_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

2 个答案:

答案 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);
        }
    );
}