mongo
シェルスクリプト、たとえばスクリプトでコマンドを実行したいtest.sh
:
#!/bin/sh
mongo myDbName
db.mycollection.findOne()
show collections
このスクリプトをを介して実行する./test.sh
と、MongoDBへの接続は確立されますが、次のコマンドは実行されません。
シェルスクリプトを使用して他のコマンドを実行する方法test.sh
?
mongo
シェルスクリプト、たとえばスクリプトでコマンドを実行したいtest.sh
:
#!/bin/sh
mongo myDbName
db.mycollection.findOne()
show collections
このスクリプトをを介して実行する./test.sh
と、MongoDBへの接続は確立されますが、次のコマンドは実行されません。
シェルスクリプトを使用して他のコマンドを実行する方法test.sh
?
回答:
コマンド--eval
が単一のコマンドの場合は、フラグを使用してコマンドを評価することもできます。
mongo --eval "printjson(db.serverStatus())"
注: $記号で始まるMongo演算子を使用している場合、シェルが演算子を環境変数として評価しないように、eval引数を一重引用符で囲みます。
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 :
mongo mydb --eval "db.users.find({a:'b'}).pretty().shellPrint()"
... simples :)
mongo --eval "db.version()" --quiet
たとえば、言うすべてのノイズを出力しないようにすることができます
mongoスクリプトを.js
ファイルに入れます。
次に実行します mongo < yourFile.js
例:
demo.js //ファイルにスクリプトがあります
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>
.js
ファイルに保存して、パラメーターとしてコマンドに渡しますmongo
。
use dbName
してshow dbs
、シェルの内部プロンプトではなく、内側からから動作します.js
ファイル。JavaScript以外のコマンドには同等のJavaScriptがあるため、これは制限ではなく、注意が必要なことです。
mongo dbName -u userName -p "password with spaces" scriptToRun.js
これはLinuxで動作します。
mongo < script.js
これを次のファイルに入れますtest.js
。
db.mycollection.findOne()
db.getCollectionNames().forEach(function(collection) {
print(collection);
});
次に、それをで実行しmongo myDbName test.js
ます。
これに関する公式のドキュメントページもあります。
そのページの例は次のとおりです。
mongo server:27017/dbname --quiet my_commands.js
mongo test --eval "printjson(db.getCollectionNames())"
以下のシェルスクリプトもうまく機能しました...確かに、Antoninが最初に述べたリダイレクトを使用する必要がありました...これにより、hereドキュメントをテストするというアイデアが生まれました。
function testMongoScript {
mongo <<EOF
use mydb
db.leads.findOne()
db.leads.find().count()
EOF
}
echo -e "use mydb\ndb.leads.findOne()\ndb.leads.find().count()" | mongo
use another_db
。:-)
db = db.getSiblingDB('otherdb');
mongo mydb <<EOF
など
私は、David Youngが言及している「ヒアドキュメント」構文を使用しています。しかし、落とし穴があります。
#!/usr/bin/sh
mongo <db> <<EOF
db.<collection>.find({
fieldName: { $exists: true }
})
.forEach( printjson );
EOF
上記は機能しません。「$ exists」というフレーズはシェルによって認識され、「exists」という名前の環境変数の値で置き換えられるためです。おそらく存在しないので、シェルを展開すると、次のようになります。
#!/usr/bin/sh
mongo <db> <<EOF
db.<collection>.find({
fieldName: { : true }
})
.forEach( printjson );
EOF
それを通過させるには、2つのオプションがあります。1つは醜いです、1つはかなりいいです。まず、醜いもの:$記号をエスケープします。
#!/usr/bin/sh
mongo <db> <<EOF
db.<collection>.find({
fieldName: { \$exists: true }
})
.forEach( printjson );
EOF
逃げるのを忘れやすいので、これはお勧めしません。
もう1つのオプションは、次のようにEOFをエスケープすることです。
#!/usr/bin/sh
mongo <db> <<\EOF
db.<collection>.find({
fieldName: { $exists: true }
})
.forEach( printjson );
EOF
これで、必要なすべてのドル記号をヒアドキュメントに入れることができ、ドル記号は無視されます。欠点:mongoスクリプトにシェルパラメータ/変数を配置する必要がある場合、これは機能しません。
あなたが遊ぶことができる別のオプションは、あなたのシバンを台無しにすることです。例えば、
#!/bin/env mongo
<some mongo stuff>
このソリューションにはいくつかの問題があります。
コマンドラインからmongoシェルスクリプトを実行可能にしようとしている場合にのみ機能します。通常のシェルコマンドとmongoシェルコマンドを混在させることはできません。そうすることで保存するのは、コマンドラインで「mongo」と入力する必要がないだけです...(もちろん十分な理由があります)
「mongo <some-js-file>」とまったく同じように機能します。つまり、「use <db>」コマンドを使用できません。
私はデータベース名をシバンに追加しようとしましたが、あなたはうまくいくと思います。残念ながら、システムがシバン行を処理する方法、最初のスペースの後のすべてが単一のパラメーターとして(引用符で囲まれているように)envコマンドに渡され、envはそれを見つけて実行できません。
代わりに、データベースの変更を次のようにスクリプト自体に埋め込む必要があります。
#!/bin/env mongo
db = db.getSiblingDB('<db>');
<your script>
人生のすべてのことと同じように、「それを行うには複数の方法があります!」
これはどう:
echo "db.mycollection.findOne()" | mongo myDbName
echo "show collections" | mongo myDbName
.mongorc
(ロードされたdocs.mongodb.org/manual/reference/program/mongo/...)
よろしくお願いしますprintf
!Linux環境では、ショーを1つのファイルだけで実行するためのより良い方法があります。mongoCmds.js
複数のコマンドを含む2つのファイルがあるとします。
use someDb
db.someColl.find()
そしてドライバーシェルファイル、 runMongoCmds.sh
mongo < mongoCmds.js
代わりに、runMongoCmds.shを含むファイルを1つだけ
printf "use someDb\ndb.someColl.find()" | mongo
Bashはよりprintf
も堅牢でecho
、\n
コマンド間で複数行に強制することができます。
mongo <<EOF
use <db_name>
db.getCollection("<collection_name>").find({})
EOF
--shellフラグはJavaScriptファイルにも使用できます
mongo --shell /path/to/jsfile/test.js
mongo /path/to/jsfile/test.js
jsも削除します。
mongo db_name --eval "db.user_info.find().forEach(function(o) {print(o._id);})"
最近mongodbからPostgresに移行しました。これが私がスクリプトを使用した方法です。
mongo < scripts.js > inserts.sql
を読み、scripts.js
に出力リダイレクトしinserts.sql
ます。
scripts.js
こんな感じ
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), ";");
inserts.sql
こんな感じ
INSERT INTO table(a, b) VALUES('abc', 'Alice'), ('def', 'Bob'), ('ghi', 'Claire');
How to execute mongo commands through shell scripts?
これはトピック外ではありません。実は、タイトルのせいでこの質問に行きました。ですから、私のような人々はそのような答えを読むことで利益を得ます。また、おもちゃの例ではなく、非常に便利な方法を示しています。
.find()
の操作は、次のような文書、印刷する結果オブジェクトに対して操作を呼び出すために必要toArray()
かをshellPrint()
。例mongo userdb --eval "printjson(db.users.find().toArray())"