【问题标题】:Mongo query works in mongo shell but not in a bash mongo --eval?Mongo 查询在 mongo shell 中有效,但在 bash mongo --eval 中无效?
【发布时间】:2018-07-27 20:07:34
【问题描述】:

这是一个示例查询:

db.readings.find( {"_id.s" : ISODate("2012-11-01T00:05:00Z") } ).count()

查询在 mongo shell 中工作。但是,在 bash 脚本中或直接在 Ubuntu shell 中

mongo fivemin --eval "printjson(db.readings.find( {"_id.s" : ISODate("2012-11-01T00:05:00Z") } ).count())"

返回一个SyntaxError: missing : after property id (shell eval):1

我似乎找不到查询的问题。我恢复到{ "_id" : {"s" : ...} },它仍然给出了同样的问题。但是find().count() 有效。

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    在 bash shell 中遇到了同样的问题。

    这会因为双引号而失败:

    mongo fivemin --eval "printjson(db.readings.find( {"_id.s" : ISODate("2012-11-01T00:05:00Z") } ).count())"
    

    但是在单引号中使用 eval 字符串是有效的:

    mongo fivemin --eval 'printjson(db.readings.find( {"_id.s" : ISODate("2012-11-01T00:05:00Z") } ).count())'
    

    如果你使用像 $regex 这样的 $ 符号,你需要转义它:

    mongo fivemin --eval 'printjson(db.readings.find( {"_id.s" : {"\$regex":"2012-11-01T*"} } ).count())'
    

    【讨论】:

      【解决方案2】:

      用单引号变成双引号,

      例如:

      mongo fivemin --eval "printjson(db.readings.find( {'_id.s' : ISODate('2012-11-01T00:05:00Z') } ).count())"
      

      【讨论】:

        【解决方案3】:

        如果查询包含 mongo 运算符,即 $ne$gt 等,则使用 --evalbash double quotes 还可能出现另一个问题,因为运算符以 $ 开头。

        双引号:

        $ echo " '$ne': null "
        $ => '': null
        

        单引号:

        $ echo ' "$ne": null '
        $ => "$ne": null
        

        Bash 尝试用变量替换这些运算符。

        $ ne = 'test'
        $ echo " '$ne': null "
        $ => 'test': null
        

        所以,我总是建议使用带单引号的--eval

        【讨论】:

          【解决方案4】:

          只是坐着想了想。 bash 在 " 上退出似乎是一个问题(应该立即注意到!)。相反,我使用了 ' (或者我猜你可以使用 /" 作为 JSON)所以查询看起来像:

          printjson(db.readings.find({'_id.s' : ISODate('2013-01-01T00:05:00Z') }).count())"

          【讨论】:

            【解决方案5】:

            处理此问题的最佳方法是在 var 中构建 mongo 命令。然后使用eval命令执行mongo命令:

            mongo_update_query="db.collectionName.update({ name:\""${some_name}"\", \
            { \$addToSet: { nick_names : { \$each : [ ${name_array} ] }}});"
            
            mongo_cmd_str=$(echo "mongo --host ${mongo_host} --port ${mongo_port} ${mongo_database} --eval '${mongo_update_query}'")
            
            # the actual call to mongo query
            eval ${mongo_cmd_str}
            

            【讨论】:

              猜你喜欢
              • 2018-07-17
              • 1970-01-01
              • 2017-05-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多