如何在express.js中编写查找和更新查询?

时间:2016-07-28 07:27:37

标签: javascript node.js mongodb express

我正在使用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';,但这不起作用,有人可以帮我吗?

1 个答案:

答案 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);
            }

        }
    );
};