我想在shell脚本中执行mongo命令,例如在脚本test.sh中:
#!/bin/sh
mongo myDbName
db.mycollection.findOne()
show collections
当我通过./test.sh执行这个脚本时,会建立到MongoDB的连接,但不会执行以下命令。
如何通过shell脚本test.sh执行其他命令?
我想在shell脚本中执行mongo命令,例如在脚本test.sh中:
#!/bin/sh
mongo myDbName
db.mycollection.findOne()
show collections
当我通过./test.sh执行这个脚本时,会建立到MongoDB的连接,但不会执行以下命令。
如何通过shell脚本test.sh执行其他命令?
当前回答
在我的情况下,我可以方便地使用\n作为分隔符的下一个mongo命令,我想要执行,然后管道他们到mongo
echo $'use your_db\ndb.yourCollection.find()' | mongo
更新版本的mongodb
echo $'use your_db\ndb.yourCollection.find()' | mongosh
其他回答
你也可以使用——eval标志对命令求值,如果它只是一个命令的话。
mongo --eval "printjson(db.serverStatus())"
请注意:如果你使用Mongo操作符,以$符号开始,你需要用单引号包围eval参数,以防止shell将操作符作为环境变量来计算:
mongo --eval 'db.mycollection.update({"name":"foo"},{$set:{"this":"that"}});' myDbName
否则你可能会看到这样的东西:
mongo --eval "db.test.update({\"name\":\"foo\"},{$set:{\"this\":\"that\"}});"
> E QUERY SyntaxError: Unexpected token :
关于这一点也有一个官方文档页面。
该页面的例子包括:
mongo server:27017/dbname --quiet my_commands.js
mongo test --eval "printjson(db.getCollectionNames())"
在我的设置中,我必须使用:
mongo --host="the.server.ip:port" databaseName theScript.js
mongodb的更新版本
mongosh --host="the.server.ip:port" databaseName theScript.js
——shell标志也可以用于javascript文件
mongo --shell /path/to/jsfile/test.js
单shell脚本解决方案,能够传递mongo参数(——quiet, dbname,等):
#!/usr/bin/env -S mongo --quiet localhost:27017/test
cur = db.myCollection.find({});
while(cur.hasNext()) {
printjson(cur.next());
}
-S标志可能不适用于所有平台。