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

Syl*_*Syl 5 mongoose node.js express

我正在尝试使用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('/');
        });
    }


})
Run Code Online (Sandbox Code Playgroud)

回应是Mod on _id is not allowed.

我只想更新WHERE id = idMySQL中的行.我找不到合适的语法.

ver*_*loc 15

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

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

注意不要将现有的模型实例用于update子句(这不起作用,并且可能导致像无限循环这样的奇怪行为).此外,请确保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; }
    //...
}
Run Code Online (Sandbox Code Playgroud)

在旁注中,您可以重写路由以执行create和update,而不使用if-else子句.update()需要一个额外的选项upsert,根据文档:

upsert(boolean)是否创建doc,如果它不匹配(false)