如何經過Shell腳本執行mongo命令?

我想在shell腳本中執行mongo命令,例如在腳本test.shjavascript

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

當我經過./test.sh執行此腳本時,將創建與MongoDB的鏈接,但不會執行如下命令。 java

如何經過shell腳本test.sh執行其餘命令? shell


#1樓

也有關於此的官方文檔頁面。 數據庫

該頁面上的示例包括: json

mongo server:27017/dbname --quiet my_commands.js
mongo test --eval "printjson(db.getCollectionNames())"

#2樓

我使用David Young提到的「 heredoc」語法。 可是有一個問題: ui

#!/usr/bin/sh

mongo <db> <<EOF
db.<collection>.find({
  fieldName: { $exists: true }
})
.forEach( printjson );
EOF

上面的命令不起做用,由於外殼程序會看到短語「 $ exists」,並用名爲「 exists」的環境變量的值代替。 可能不存在,所以在shell擴展後,它變爲: spa

#!/usr/bin/sh

mongo <db> <<EOF
db.<collection>.find({
  fieldName: { : true }
})
.forEach( printjson );
EOF

爲了使它經過,您有兩個選擇。 一個很醜,一個很不錯。 一,醜陋的一面:逃脫$符號: 命令行

#!/usr/bin/sh

mongo <db> <<EOF
db.<collection>.find({
  fieldName: { \$exists: true }
})
.forEach( printjson );
EOF

我不建議這樣作,由於很容易忘記逃脫。 code

另外一個選擇是逃避EOF,以下所示: server

#!/usr/bin/sh

mongo <db> <<\EOF
db.<collection>.find({
  fieldName: { $exists: true }
})
.forEach( printjson );
EOF

如今,您能夠將全部所需的美圓符號放入heredoc中,而美圓符號將被忽略。 不利的一面:若是您須要在mongo腳本中放入shell參數/變量,那將不起做用。

您可使用的另外一種選擇是弄亂您的shebang。 例如,

#!/bin/env mongo
<some mongo stuff>

此解決方案存在幾個問題:

  1. 僅當您嘗試從命令行使mongo shell腳本可執行時,它纔有效。 您不能將常規的shell命令與mongo shell命令混合使用。 這樣,您節省的全部事情都沒必要在命令行上鍵入「 mongo」 ...(固然,理由足夠多)

  2. 它的功能與「 mongo <some-js-file>」徹底相同,這意味着它不容許您使用「 use <db>」命令。

我嘗試過將數據庫名稱添加到shebang中,您認爲這會起做用。 不幸的是,系統處理shebang行的方式是,第一個空格以後的全部內容都做爲單個參數(如被引用)傳遞給env命令,而env找不到並運行它。

相反,您必須將數據庫更改嵌入腳本自己中,以下所示:

#!/bin/env mongo
db = db.getSiblingDB('<db>');
<your script>

就像生活中的一切同樣,「有不止一種方法能夠作到這一點!」


#3樓

這個怎麼樣:

echo "db.mycollection.findOne()" | mongo myDbName
echo "show collections" | mongo myDbName

#4樓

--shell標誌也可用於javascript文件

mongo --shell /path/to/jsfile/test.js

#5樓

謝謝printf ! 在Linux環境中,這是一種只運行一個文件的更好方法。 假設您有兩個帶有多個命令的文件mongoCmds.js

use someDb
db.someColl.find()

而後是驅動程序外殼文件runMongoCmds.sh

mongo < mongoCmds.js

相反,只有一個文件,其中包含runMongoCmds.sh

printf "use someDb\ndb.someColl.find()" | mongo

Bash的printfecho更爲健壯,而且容許在命令之間使用\\n將它們強制在多行上。

相關文章
相關標籤/搜索