美文网首页
MongoDB变量如何传参给查询条件

MongoDB变量如何传参给查询条件

作者: JacobMa1996 | 来源:发表于2017-03-26 21:38 被阅读0次

    最近需要在express中使用AJAX,通过AJAX给数据库更新用户表,但是用户数据很多,所以需要把查询条件写成动态的,即通过变量给mongodb中的update传参;
    首先我们先来看看mongodb中update如何使用:

    db.collection.update(
       <query>,
       <update>,
       {
         upsert: <boolean>,
         multi: <boolean>,
         writeConcern: <document>
       }
    )
    
    • query : update的查询条件,类似sql update查询内where后面的。
    • update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql -
      update查询内set后面的
    • upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
    • multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
    • writeConcern :可选,抛出异常的级别。

    5个参数,在这不多解释,我们直接看列子即可明白:

    db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}})
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })   # 输出信息
    

    SegmentFault平台上给了一个解决方法,

    SegmentFault-example.PNG
    原文地址:https://segmentfault.com/q/1010000004511023
    暂不讨论此方法是否可行(用官方的语法去解析是最好的,但笔者试过不行,可能使低级错误或环境问题);
    于是乎,我试着用其他方法,然后看到菜鸟教程中在Node.js中使用mMongoDB的更新操作受到了启发,关键代码是这样的:
        var whereStr = {"name":'菜鸟教程'};
        var updateStr = {$set: { "url" : "https://www.runoob.com" }};
        collection.update(whereStr,updateStr, function(err, result) {
            if(err)
            {
                console.log('Error:'+ err);
                return;
            }     
            callback(result);
        });
    

    就是把查询条件赋值给变量,这个变量当然使一个对象,然后我们可以通过在变量中把参数传递进去(因为在查询语句中无法加参数,会有语法错误)
    而直接把变量写在查询条件中使识别不了的,就像给JSON对象赋值时,用变量是没有用的,它会自动解析为属性key,键名;
    于是,我们可以用函数使JSON对象的键名通过参数传递:
    参考了百度知道上json对象创建时,key为变量,如何取其值?的方法:

    百度知道.PNG
    原文地址:https://zhidao.baidu.com/question/518699972198979285.html
    于是,当key只有一个时,我们可以这样:
    <script type="text/javascript">
        var key = 'phone';
        var key2 = 'personalInfos.' + key;
        var value = '110';
        var updateStr = [];
        function setKey(key,array){
            var resultArray = [];
            var temp = {};
            temp[key] = value;
            resultArray.push(temp);
            return resultArray;
        }
        var updateStr = setKey(key2,value);
        console.log(updateStr[0]);
    </script>
    

    在控制台console中输出

    Object
      personalInfos.phone:"110"
    __proto__:Object
    

    那么转移到mongoDB中,下面是我的源代码:

    User.update = function (name, key, value, callback) {
        var key2 = 'personalInfos.' + key;
        var updateStr = [];
        function setKey(keyName,valueName){
            var resultJson = [];
            var temp = {};
            temp[keyName] = valueName;
            resultJson.push(temp);
            return resultJson;
        }
        updateStr = setKey(key2,value);
    
        mongodb.open(function (err, db) {
            if (err) {
                return callback(err);
            }
            db.collection('User', function (err, collection) {
                if (err) {
                    mongodb.close();
                    return callback(err);
                }
                collection.update(
                    {},
                    {
                        "$set": updateStr[0]
                    },
                    function (err, user) {
                        mongodb.close();
                        if (err) {
                            return callback(err);
                        }
                        callback(null, user);
                    }
                )
            })
        })
    }
    

    最后,成功的给通过每个不同的key给查询到数据库的key,从而赋值。

    相关文章

      网友评论

          本文标题:MongoDB变量如何传参给查询条件

          本文链接:https://www.haomeiwen.com/subject/vnokottx.html