java调用js查询mongo_如何通过Shell脚本执行mongo命令?

我想在shell脚本中执行mongo命令,例如在脚本test.sh :

#!/bin/sh

mongo myDbName

db.mycollection.findOne()

show collections

当我通过./test.sh执行此脚本时,将建立与MongoDB的连接,但不会执行以下命令。

如何通过shell脚本test.sh执行其他命令?

#1楼

也有关于此的官方文档页面。

该页面上的示例包括:

mongo server:27017/dbname --quiet my_commands.js

mongo test --eval "printjson(db.getCollectionNames())"

#2楼

我使用David Young提到的“ heredoc”语法。 但是有一个问题:

#!/usr/bin/sh

mongo <

db..find({

fieldName: { $exists: true }

})

.forEach( printjson );

EOF

上面的命令不起作用,因为外壳程序会看到短语“ $ exists”,并用名为“ exists”的环境变量的值代替。 可能不存在,因此在shell扩展后,它变为:

#!/usr/bin/sh

mongo <

db..find({

fieldName: { : true }

})

.forEach( printjson );

EOF

为了使它通过,您有两个选择。 一个很丑,一个很不错。 一,丑陋的一面:逃脱$符号:

#!/usr/bin/sh

mongo <

db..find({

fieldName: { \$exists: true }

})

.forEach( printjson );

EOF

我不建议这样做,因为很容易忘记逃脱。

另一个选择是逃避EOF,如下所示:

#!/usr/bin/sh

mongo <

db..find({

fieldName: { $exists: true }

})

.forEach( printjson );

EOF

现在,您可以将所有所需的美元符号放入heredoc中,而美元符号将被忽略。 不利的一面:如果您需要在mongo脚本中放入shell参数/变量,那将不起作用。

您可以使用的另一种选择是弄乱您的shebang。 例如,

#!/bin/env mongo

此解决方案存在几个问题:

仅当您尝试从命令行使mongo shell脚本可执行时,它才有效。 您不能将常规的shell命令与mongo shell命令混合使用。 这样,您节省的所有事情都不必在命令行上键入“ mongo” ...(当然,理由足够多)

它的功能与“ mongo ”完全相同,这意味着它不允许您使用“ use ”命令。

我尝试过将数据库名称添加到shebang中,您认为这会起作用。 不幸的是,系统处理shebang行的方式是,第一个空格之后的所有内容都作为单个参数(如被引用)传递给env命令,而env找不到并运行它。

相反,您必须将数据库更改嵌入脚本本身中,如下所示:

#!/bin/env mongo

db = db.getSiblingDB('');

就像生活中的一切一样,“有不止一种方法可以做到这一点!”

#3楼

这个怎么样:

echo "db.mycollection.findOne()" | mongo myDbName

echo "show collections" | mongo myDbName

#4楼

--shell标志也可用于javascript文件

mongo --shell /path/to/jsfile/test.js

#5楼

谢谢printf ! 在Linux环境中,这是一种只运行一个文件的更好方法。 假设您有两个带有多个命令的文件mongoCmds.js :

use someDb

db.someColl.find()

然后是驱动程序外壳文件runMongoCmds.sh

mongo < mongoCmds.js

相反,只有一个文件,其中包含runMongoCmds.sh

printf "use someDb\ndb.someColl.find()" | mongo

Bash的printf比echo更为健壮,并且允许在命令之间使用\\n将它们强制在多行上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值