如何经过Shell脚本执行mongo命令?

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

#!/bin/sh
mongo myDbName
db.mycollection.findOne()
show collections

当我经过./test.sh执行此脚本时,将创建与MongoDB的链接,但不会执行如下命令。 java

如何经过shell脚本test.sh执行其余命令? shell


#1楼

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

该页面上的示例包括: json

mongo server:27017/dbname --quiet my_commands.js
mongo test --eval "printjson(db.getCollectionNames())"

#2楼

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

#!/usr/bin/sh

mongo <db> <<EOF
db.<collection>.find({
  fieldName: { $exists: true }
})
.forEach( printjson );
EOF

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

#!/usr/bin/sh

mongo <db> <<EOF
db.<collection>.find({
  fieldName: { : true }
})
.forEach( printjson );
EOF

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

#!/usr/bin/sh

mongo <db> <<EOF
db.<collection>.find({
  fieldName: { \$exists: true }
})
.forEach( printjson );
EOF

我不建议这样作,由于很容易忘记逃脱。 code

另外一个选择是逃避EOF,以下所示: server

#!/usr/bin/sh

mongo <db> <<\EOF
db.<collection>.find({
  fieldName: { $exists: true }
})
.forEach( printjson );
EOF

如今,您能够将全部所需的美圆符号放入heredoc中,而美圆符号将被忽略。 不利的一面:若是您须要在mongo脚本中放入shell参数/变量,那将不起做用。

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

#!/bin/env mongo
<some mongo stuff>

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

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

  2. 它的功能与“ mongo <some-js-file>”彻底相同,这意味着它不容许您使用“ use <db>”命令。

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

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

#!/bin/env mongo
db = db.getSiblingDB('<db>');
<your script>

就像生活中的一切同样,“有不止一种方法能够作到这一点!”


#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的printfecho更为健壮,而且容许在命令之间使用\\n将它们强制在多行上。

相关文章
相关标签/搜索