我想在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执行其他命令?
当前回答
当使用复制集时,必须在PRIMARY上进行写操作,所以我通常使用这样的语法,以避免弄清楚哪个主机是主主机:
mongo -host myReplicaset/anyKnownReplica
其他回答
谢谢printf!在Linux环境中,有一种更好的方法,可以只让一个文件运行。假设你有两个文件,蒙古cmds .js有多个命令:
use someDb
db.someColl.find()
然后运行驱动shell文件:runMongoCmds.sh
mongo < mongoCmds.js
更新版本的mongodb
mongosh < mongoCmds.js
相反,只有一个文件runMongoCmds.sh包含
printf "use someDb\ndb.someColl.find()" | mongo
Bash的printf比echo健壮得多,并且允许命令之间的\n强制它们在多行上。
这适用于我在Linux下:
mongo < script.js
mongodb的更新版本
mongosh < script.js
最近从mongodb迁移到Postgres。这是我使用脚本的方式。
mongo < scripts.js > inserts.sql
读取scripts.js,输出重定向到inserts.sql。
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), ";");
插入。SQL看起来像这样
INSERT INTO table(a, b) VALUES('abc', 'Alice'), ('def', 'Bob'), ('ghi', 'Claire');
mongo <<EOF
use <db_name>
db.getCollection("<collection_name>").find({})
EOF
遗留的mongo shell已从MongoDB中移除,并将于2022年发布第6版
有一种使用新shell mongosh执行shell脚本的新方法
来自编写脚本的shell文档:
您可以使用mongosh从命令行执行脚本,而无需进入mongosh控制台 要指定文件名,请使用——file或-f参数指定文件名 您可能还需要指定连接信息