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('/');
        });
    }


})

响应是Mod on _id is not allowed

我只想更新WHERE id = idMySQL 中的行。我没有找到正确的语法。

4

2 回答 2

17

根据这个问题另一个问题,Mod on _id is not allowed当一个人尝试根据它的 id 更新一个对象而不先删除它时,就会发生这种情况。

我还发现了这个试图解释解决方案的github 问题。它明确指出:

小心不要将现有模型实例用于更新子句(这不起作用,并且可能导致奇怪的行为,如无限循环)。此外,请确保 update 子句没有 _id 属性,这会导致 Mongo 返回“Mod on _id not allowed”错误。

解决方案似乎是执行以下操作:

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 (boolean) 如果文档不匹配,是否创建文档 (false)

于 2013-06-22T12:48:08.953 回答
1

这是我的解决方案:

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)

}

}
于 2019-11-25T10:35:53.720 回答