我正在使用REST API(express.js和mongodb)并尝试更新我的文档,但它无法正常工作。我不知道错误是什么,但有人可以帮我前进吗?我添加了我的路线和控制器
路线:
app.route('/articleupdation')
.post(article.updatearticle);
控制器:
exports.updatearticle = function(req, res) {
Article.findOne({
Username: 'xx',
Email: 'xx@gmail.com',
Info: 'Deactivate',
}, function(err, article) {
if (!err && article) {
article.Info = 'Active';
article.save(function(err) {
if (err) {
console.log('not working');
} else {
console.log('working');
}
});
} else {
console.log('Condtion not matched ');
console.log(err);
}
});
};
像这样存储的数据
{
"_id": {
"$oid": "5799995943d643600fabd6b7"
},
"Username": "xx",
"Email": "xx@gmail.com",
"Info": "Deactivate",
"Description": "aajdjdjddjdkjddjdjdhdj",
}
这是我想要实现的目标;如果Username, Email, Info
匹配,我需要更新article.Info = 'Active';
,但这不起作用,有人可以帮我吗?
答案 0 :(得分:1)
从它的外观来看,你的查询不匹配集合中的任何文档,因此没有到达进行更新的语句分支,只是else语句,因为返回的文章为null。您可以通过在底层集合的mongo shell中运行原始查询来测试它,例如
db.articles.findOne({
"Username": "xx",
"Email": "xx@gmail.com",
"Info": "Deactivate"
})
并查看是否返回任何匹配的文档。如果没有,请检查此查询中返回的文档中的Info
字段
db.articles.findOne({
"Username": "xx",
"Email": "xx@gmail.com"
})
在原子更新中,不需要向服务器发出两个请求(即一个查询文档,另一个将更改写入服务器)的最佳方法是使用 {{ 3}} api。这将发出mongodb findOneAndUpdate
更新命令,该命令修改并返回单个文档。默认情况下,返回的文档不包括对更新所做的修改。要返回包含对更新所做修改的文档,请使用新选项。
因此,您的重构代码可以遵循以下模式:
exports.updatearticle = function(req, res) {
Article.findOneAndUpdate(
{ "Username": req.body.username, "Email": req.body.email, "Info": "Deactivate" },
{ "$set": { "Info": "Active" } },
{ "new": true },
function (err, doc) {
if (err) { // err: any errors that occurred
console.log(err);
} else { // doc: the document before updates are applied if `new: false`
console.log(doc); // , the document returned after updates if `new true`
console.log(doc.Info);
}
}
);
};