如何通过shell脚本执行mongo命令?

我想在shell脚本中执行mongo命令。

我尝试下面的方式test.sh

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

当我执行上面的脚本./test.sh

然后build立了mongo连接,但是下一个命令没有执行

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

请帮帮我

如果只是一个命令,您也可以使用--eval标志来评估一个命令。

 mongo --eval "printjson(db.serverStatus())" 

请注意:如果您使用的是Mongo运算符,则以$符号开头,您将需要在单引号中包含eval参数,以防止shell将运算符评估为环境variables:

 mongo --eval 'db.test.update({"name":"foo"},{$set:{"this":"that"}});' 

否则,你可能会看到这样的事情:

 mongo --eval "db.test.update({\"name\":\"foo\"},{$set:{\"this\":\"that\"}});" > E QUERY SyntaxError: Unexpected token : 

把你的mongo脚本放入一个.js文件。

然后执行mongo < yourFile.js

例如:

demo.js //文件有你的脚本

 use sample //db name show collections 

把这个文件保存在“c:\ db-scripts”

然后在cmd提示符下,转到“c:\ db-scripts”

 C:\db-scripts>mongo < demo.js 

这将执行mongo中的代码并显示输出

 C:\db-scripts>mongo < demo.js Mongo shell version: 3.0.4 Connecting to: test switched to db sample users //collection name tasks //collection name bye C:\db-scripts> 

这在Linux下适用于我:

 mongo < script.js 

把它放在一个名为test.js的文件中:

 db.mycollection.findOne() db.getCollectionNames().forEach(function(collection) { print(collection); }); 

然后用mongo myDbName test.js运行它。

还有一个关于这个的官方文档页面。

该页面的示例包括:

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

下面的shell脚本也为我工作得很好… definite不得不使用Antonin提到的redirect…这让我有想法来testing这里的文档。

 function testMongoScript { mongo <<EOF use mydb db.leads.findOne() db.leads.find().count() EOF } 

在我的设置中,我必须使用:

 mongo --host="the.server.ip:port" databaseName theScript.js 

这个怎么样:

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

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

 #!/usr/bin/sh mongo <db> <<EOF db.<collection>.find({ fieldName: { $exists: true } }) .forEach( printjson ); EOF 

以上将不起作用,因为短语“$存在”将被shell看到,并被replace为名为“exists”的环境variables的值。 这可能不存在,所以在shell扩展之后,它变成:

 #!/usr/bin/sh mongo <db> <<EOF db.<collection>.find({ fieldName: { : true } }) .forEach( printjson ); EOF 

为了让它通过你有两个select。 一个很丑,一个很好。 首先,丑陋的一个:逃避$的迹象:

 #!/usr/bin/sh mongo <db> <<EOF db.<collection>.find({ fieldName: { \$exists: true } }) .forEach( printjson ); EOF 

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

另一个select是逃避EOF,就像这样:

 #!/usr/bin/sh mongo <db> <<\EOF db.<collection>.find({ fieldName: { $exists: true } }) .forEach( printjson ); EOF 

现在,你可以把你想要的所有美元符号放在你的heredoc中,美元符号被忽略。 不利的一面:如果你需要在你的mongo脚本中joinshell参数/variables,那么这是行不通的。

你可以玩的另一个select是混乱你的屁股。 例如,

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

这个解决scheme有几个问题:

  1. 它只适用于你正在尝试从命令行制作mongo shell脚本的可执行文件。 您不能将常规shell命令与mongo shell命令混合使用。 而你所省下的只是在命令行上不必input“mongo”(当然,理由已经足够了)

  2. 它的function与“mongo <some-js-file>”完全一致,这意味着它不允许使用“use <db>”命令。

我已经尝试将数据库名称添加到shebang,你会认为这将工作。 不幸的是,系统处理shebang行的方式,第一个空格之后的所有内容作为一个单独的parameter passing给env命令,并且env无法find并运行它。

相反,您必须在脚本中embedded数据库更改,如下所示:

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

就像生活中的任何事情一样,“有多种方法可以做到!”

谢谢printf ! 在Linux环境中,这里只有一个文件可以运行显示。 假设你有两个文件, mongoCmds.js和多个命令:

 use someDb db.someColl.find() 

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

 mongo < mongoCmds.js 

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

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

Bash的printfecho强壮得多,并且允许\n之间的命令强制他们在多行。

正如theTuxRacer所build议的theTuxRacer ,您可以使用eval命令,对于那些像我一样缺less的命令,如果您不试图在默认数据库上执行预操作,还可以添加数据库名称。

 mongo <dbname> --eval "printjson(db.something.find())" 

–shell标志也可以用于JavaScript文件

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

如果您启用了身份validation:

 mongo -u username -p password --authenticationDatabase auth_db_name < your_script.js 

创build一个脚本文件; 写命令:

 #!/bin/sh mongo < file.js 

file.js写下你的mongo查询:

 db.collection.find({"myValue":null}).count(); 
 mongo db_name --eval "db.user_info.find().forEach(function(o) {print(o._id);})" 

最近从MongoDB迁移到Postgres。 这是我如何使用脚本。

 mongo < scripts.js > inserts.sql 

阅读scripts.js并输出redirect到inserts.sql

scripts.js看起来像这样

 use myDb; var string = "INSERT INTO table(a, b) VALUES"; db.getCollection('collectionName').find({}).forEach(function (object) { string += "('" + String(object.description) + "','" + object.name + "'),"; }); print(string.substring(0, string.length - 1), ";"); 

inserts.sql看起来像这样

 INSERT INTO table(a, b) VALUES('abc', 'Alice'), ('def', 'Bob'), ('ghi', 'Claire');