天天看點

java調用js查詢mongo_如何通過Shell腳本執行mongo指令?

我想在shell腳本中執行mongo指令,例如在腳本test.sh :

#!/bin/sh

mongo myDbName

db.mycollection.findOne()

show collections

當我通過./test.sh執行此腳本時,将建立與MongoDB的連接配接,但不會執行以下指令。

如何通過shell腳本test.sh執行其他指令?

#1樓

也有關于此的官方文檔頁面。

該頁面上的示例包括:

mongo server:27017/dbname --quiet my_commands.js

mongo test --eval "printjson(db.getCollectionNames())"

#2樓

我使用David Young提到的“ heredoc”文法。 但是有一個問題:

#!/usr/bin/sh

mongo <

db..find({

fieldName: { $exists: true }

})

.forEach( printjson );

EOF

上面的指令不起作用,因為外殼程式會看到短語“ $ exists”,并用名為“ exists”的環境變量的值代替。 可能不存在,是以在shell擴充後,它變為:

#!/usr/bin/sh

mongo <

db..find({

fieldName: { : true }

})

.forEach( printjson );

EOF

為了使它通過,您有兩個選擇。 一個很醜,一個很不錯。 一,醜陋的一面:逃脫$符号:

#!/usr/bin/sh

mongo <

db..find({

fieldName: { \$exists: true }

})

.forEach( printjson );

EOF

我不建議這樣做,因為很容易忘記逃脫。

另一個選擇是逃避EOF,如下所示:

#!/usr/bin/sh

mongo <

db..find({

fieldName: { $exists: true }

})

.forEach( printjson );

EOF

現在,您可以将所有所需的美元符号放入heredoc中,而美元符号将被忽略。 不利的一面:如果您需要在mongo腳本中放入shell參數/變量,那将不起作用。

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

#!/bin/env mongo

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

僅當您嘗試從指令行使mongo shell腳本可執行時,它才有效。 您不能将正常的shell指令與mongo shell指令混合使用。 這樣,您節省的所有事情都不必在指令行上鍵入“ mongo” ...(當然,理由足夠多)

它的功能與“ mongo ”完全相同,這意味着它不允許您使用“ use ”指令。

我嘗試過将資料庫名稱添加到shebang中,您認為這會起作用。 不幸的是,系統處理shebang行的方式是,第一個空格之後的所有内容都作為單個參數(如被引用)傳遞給env指令,而env找不到并運作它。

相反,您必須将資料庫更改嵌入腳本本身中,如下所示:

#!/bin/env mongo

db = db.getSiblingDB('');

就像生活中的一切一樣,“有不止一種方法可以做到這一點!”

#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的printf比echo更為健壯,并且允許在指令之間使用\\n将它們強制在多行上。

上一篇: JavaEE 第六周