我想在shell脚本中执行mongo命令,例如在脚本test.sh中:

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

当我通过./test.sh执行这个脚本时,会建立到MongoDB的连接,但不会执行以下命令。

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


当前回答

当使用复制集时,必须在PRIMARY上进行写操作,所以我通常使用这样的语法,以避免弄清楚哪个主机是主主机:

mongo -host myReplicaset/anyKnownReplica

其他回答

将mongo脚本放到.js文件中。

然后执行mongo < yourFile.js

Ex:

Demo.js //file有你的脚本

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>

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

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

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

下面的shell脚本也很适合我……definite不得不使用Antonin一开始提到的重定向…这让我产生了测试这里文档的想法。

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

在我的情况下,我可以方便地使用\n作为分隔符的下一个mongo命令,我想要执行,然后管道他们到mongo

echo $'use your_db\ndb.yourCollection.find()' | mongo

更新版本的mongodb

echo $'use your_db\ndb.yourCollection.find()' | mongosh

如果你想用一条线来处理它,这是一个简单的方法。

file.sh --> db.EXPECTED_COLLECTION.remove("_id":1234)

cat file.sh | mongo <EXPECTED_COLLECTION>