使用Mongoose更新_id = :id的记录

8
我正在尝试使用Mongoose更新现有记录。插入操作正常,但是更新操作不正常。

这是我的代码片段:

app.post('/submit', function(req, res) {

    var my_visit = new models.visits({
        date: req.body.visit_date,
        type: req.body.visit_type,
        agency: req.body.visit_agency,
        city: req.body.visit_city,
        url: req.body.visit_url,
        note: req.body.visit_note
    });

    // INSERT
    if(req.body.id == 0) {
        my_visit.save(function(err) {
            if(err) { throw err; }

            console.log('added visit');

            res.redirect('/');
        });
    } else { // UPDATE
        var upsertData = my_visit.toObject();

        console.log(req.body.id); // OK

        models.visits.update({ _id: req.body.id }, upsertData, { multi: false }, function(err) {
            if(err) { throw err; }

            console.log('updated visit: '+ req.body.id);

            res.redirect('/');
        });
    }


})

该响应为不允许在_id上进行修改

我想要在MySQL中更新如WHERE id = id的语句,但我找不到正确的语法。

2个回答

17
根据这个问题另一个问题,当你尝试在不先删除对象的情况下根据其id进行更新时,会出现Mod on _id is not allowed错误。
我还发现了这个GitHub问题,其中试图解释一种解决方案。它明确指出:

要注意不要在更新子句中使用现有的模型实例(这样不起作用,并可能导致奇怪的行为,如无限循环)。此外,请确保更新子句没有一个_id属性,这会导致Mongo返回一个“不允许对_id进行修改”的错误。

解决方案似乎是执行以下操作:
var upsertData = my_visit.toObject();

console.log(req.body.id); // OK

delete upsertData._id;

models.visits.update({ _id: req.body.id }, upsertData, { multi: false }, function(err) {
    if(err) { throw err; }
    //...
}

顺便提一下,你可能可以重写你的路由,不需要使用if-else语句就能同时实现创建和更新。 update() 函数有一个额外的选项 upsert,根据文档中的描述:

upsert(布尔值)表示如果记录不存在是否要创建新记录(false)


2
这是我的解决方案:
routes/router.js
router.patch('/user/:id', userController.updateUser)
exports.updateUser  =  async(req, res) => {



const  updates  =  Object.keys(req.body)

const  allowedUpdates  = ['name', 'email', 'password', 'age']

const  isValidOperation  =  updates.every((update) =>  allowedUpdates.includes(update))



if (!isValidOperation) {

return  res.status(400).send('Invalid updates!')

}



try {

const  user  =  await  UserModel.findByIdAndUpdate(req.params.id, req.body, { new:  true, runValidators:  true })



if (!user) {

return  res.status(404).send()

}



res.status(201).send(user)

} catch (error) {

res.status(400).send(error)

}

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接