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

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

我想在shell脚本中执行
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());
}