我正在尝试使用 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 = id
在 MySQL 中。我没有找到正确的语法。
根据这个问题 https://stackoverflow.com/questions/13337685/mongoose-js-how-to-implement-create-or-update and 另一个 https://stackoverflow.com/questions/13352735/mongoose-document-update-error, the Mod on _id is not allowed
当尝试根据对象的 id 更新对象而不先删除它时,就会发生这种情况。
我也发现了这个github问题 https://github.com/LearnBoost/mongoose/issues/571它试图解释一个解决方案。它明确指出:
请注意不要将现有模型实例用于更新子句
(这不起作用,并且可能会导致奇怪的行为,例如无限循环)。
另外,确保 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() http://mongoosejs.com/docs/api.html#model_Model.update需要一个额外的选项upsert
,根据文档:
upsert (boolean) 如果不匹配是否创建文档 (false)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)