Mongodb 如何通过shell脚本执行mongo命令?
我想在shell脚本中执行Mongodb 如何通过shell脚本执行mongo命令?,mongodb,bash,shell,sh,Mongodb,Bash,Shell,Sh,我想在shell脚本中执行mongo命令,例如在脚本test.sh中: #!/bin/sh mongo myDbName db.mycollection.findOne() show collections 当我通过/test.sh执行此脚本时,会建立到MongoDB的连接,但不会执行以下命令 如何通过shell脚本执行其他命令test.sh?将mongo脚本放入.js文件中 然后执行mongomongomongo 将其放入名为test.js的文件中: db.mycollection.find
mongo
命令,例如在脚本test.sh
中:
#!/bin/sh
mongo myDbName
db.mycollection.findOne()
show collections
当我通过/test.sh
执行此脚本时,会建立到MongoDB的连接,但不会执行以下命令
如何通过shell脚本执行其他命令
test.sh
?将mongo脚本放入.js
文件中
然后执行mongo
例:
demo.js//文件包含您的脚本
use sample //db name
show collections
将此文件保存在“c:\db脚本”中
然后在cmd提示符中转到“c:\db脚本”
C:\db scripts>mongo
这将在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>
C:\db scripts>mongo
将其放入名为test.js的文件中:
db.mycollection.findOne()
db.getCollectionNames().forEach(function(collection) {
print(collection);
});
然后使用mongo myDbName test.js运行它
您还可以使用--eval
标志对命令求值,如果它只是一个命令
mongo --eval "printjson(db.serverStatus())"
请注意:如果您使用的是Mongo运算符,从$sign开始,您需要将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 :
#!/usr/bin/sh
mongo <db> <<\EOF
db.<collection>.find({
fieldName: { $exists: true }
})
.forEach( printjson );
EOF
这在Linux下适用于我:
mongo < script.js
mongo下面的shell脚本对我来说也很好。。。definite必须使用Antonin最初提到的重定向。。。这让我有了测试here文档的想法
function testMongoScript {
mongo <<EOF
use mydb
db.leads.findOne()
db.leads.find().count()
EOF
}
函数testMongoScript{
mongo在我的设置中,我必须使用:
mongo --host="the.server.ip:port" databaseName theScript.js
还有一页是关于这个的
该页的示例包括:
mongo server:27017/dbname --quiet my_commands.js
mongo test --eval "printjson(db.getCollectionNames())"
我使用了David Young提到的“heredoc”语法。但有一个陷阱:
#!/usr/bin/sh
mongo <db> <<EOF
db.<collection>.find({
fieldName: { $exists: true }
})
.forEach( printjson );
EOF
!/usr/bin/sh
mongo这个怎么样:
echo "db.mycollection.findOne()" | mongo myDbName
echo "show collections" | mongo myDbName
--shell标志也可用于javascript文件
mongo --shell /path/to/jsfile/test.js
谢谢您printf
!在Linux环境中,这里有一个更好的方法,可以让一个文件运行该节目。假设您有两个文件,mongoCmds.js
,其中包含多个命令:
use someDb
db.someColl.find()
#!/bin/sh
mongo < file.js
然后是驱动程序shell文件,runMongoCmds.sh
mongo < mongoCmds.js
Bash的printf
比echo
更健壮,允许命令之间的\n
强制它们在多行上执行。正如TuxRacer
所建议的,您可以使用eval命令,对于那些像我一样缺少它的人,如果您不想执行操作,您还可以添加您的db名称默认数据库上的ion
mongo <dbname> --eval "printjson(db.something.find())"
mongo--eval“printjson(db.something.find())”
最近从mongodb迁移到Postgres。这就是我使用脚本的方式
mongo < scripts.js > inserts.sql
inserts.sql
如下所示
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), ";");
INSERT INTO table(a, b) VALUES('abc', 'Alice'), ('def', 'Bob'), ('ghi', 'Claire');
如果已启用身份验证,请执行以下操作:
mongo -u username -p password --authenticationDatabase auth_db_name < your_script.js
mongo-u username-p password--authenticationDatabase auth\u db\u name
创建脚本文件;编写命令:
use someDb
db.someColl.find()
#!/bin/sh
mongo < file.js
如果你想用一条线来处理它,这是一个简单的方法
file.sh --> db.EXPECTED_COLLECTION.remove("_id":1234)
cat file.sh | mongo <EXPECTED_COLLECTION>
file.sh-->数据库。应为\u集合。删除(“\u id”:1234)
cat file.sh|mongo
mongo在我的例子中,我可以方便地使用\n
作为我要执行的下一个mongo命令的分隔符,然后将它们输送到mongo
echo $'use your_db\ndb.yourCollection.find()' | mongo
单shell脚本解决方案,能够传递mongo参数(--quiet
、dbname等):
-S
标志可能无法在所有平台上工作。使用replicaset时,写入必须在主服务器上完成,因此我通常使用这样的语法,以避免必须确定哪个主机是主服务器:
mongo-hostmyreplicaset/anyKnownReplica
相当准确地说..您使用与输入mongo shell完全相同的命令,将这些命令保存到.js
文件中,并将其作为参数传递给mongo
命令。值得注意的是您在--eval语句中设置的任何内容(如果提供的话)执行脚本(如果提供)时,mongo解释器将保留在作用域中。您可以使用它使脚本更加可重用,例如mongo--eval“somevar='someval';”db\u name脚本\u使用\u somevar。js@Matt--请注意,shell提供的非JavaScript命令在已执行的JavaScript文件中不可用,因此use dbName
和show dbs
将在shell的内部提示符下工作,而不是在.js
文件内。非JavaS有JavaScript等价物脚本命令,所以这不是一个限制,只是您需要注意的一点。如果您需要指定数据库的名称、用户名、密码,您可以执行mongo dbName-u userName-p“password with spaces”scriptToRun.js
是否有办法保持mongo提示符打开?也就是说,我不想让mongo说“再见”对我来说。回答得很好!对于多个命令,这同样有效:echo-e“使用mydb\ndb.leads.findOne()\ndb.leads.find().count()”| mongo
绝对有用,因为你不能使用“使用mydb”在JS文件中。谢谢!最后我可以调用使用另一个\u db
:-)实际上,您可以在mongo脚本中切换db:db=db.getSiblingDB('otherdb'));
正是我所需要的。但是,如果您只需要使用一个数据库,您可以将数据库名称传递给mongo命令,例如mongo mydb For。find()
操作,您需要调用result对象上的一个操作来打印文档,例如toArray()
或shellPrint()
。例如,mongo userdb--eval“printjson(db.users.find().toArray())”
我必须指定连接字符串,比如mongo:/db--eval“printjson(db.serverStatus())”或mongo:/dbmongo mydb--eval“db.users.find({a:'b}).pretty().shellPrint()“
…simples:)我希望
INSERT INTO table(a, b) VALUES('abc', 'Alice'), ('def', 'Bob'), ('ghi', 'Claire');
mongo -u username -p password --authenticationDatabase auth_db_name < your_script.js
#!/bin/sh
mongo < file.js
db.collection.find({"myValue":null}).count();
file.sh --> db.EXPECTED_COLLECTION.remove("_id":1234)
cat file.sh | mongo <EXPECTED_COLLECTION>
mongo <<EOF
use <db_name>
db.getCollection("<collection_name>").find({})
EOF
echo $'use your_db\ndb.yourCollection.find()' | mongo
#!/usr/bin/env -S mongo --quiet localhost:27017/test
cur = db.myCollection.find({});
while(cur.hasNext()) {
printjson(cur.next());
}