回答:
シェルはインタラクティブな環境であるため、いくつかの優れた機能が隠されています。
mongo commands.jsを介してJavaScriptファイルからコマンドを実行すると、まったく同じ動作は得られません。
これを回避するには2つの方法があります。
(1)シェルを偽造し、インタラクティブモードにいると思わせる
$ mongo dbname << EOF > output.json
db.collection.find().pretty()
EOF
または
(2)Javascriptを使用find()
してaの結果を印刷可能なJSONに変換する
mongo dbname command.js > output.json
ここで、command.jsにはこれ(またはそれに相当するもの)が含まれています。
printjson( db.collection.find().toArray() )
これにより、結果の配列がきれいに出力されます[ ]
-したくない場合は、配列とprintjson()
各要素を反復処理できます。
ちなみに、JavaScriptステートメントを1つだけ実行している場合は、それをファイルに入れる必要はなく、代わりに次のように使用できます。
$ mongo --quiet dbname --eval 'printjson(db.collection.find().toArray())' > output.json
mongo blah.mongolab.com:33478/blah -u user -p pass --eval "my query" >> dump.txt
が、それは私に与えましたJavaScript execution failed: SyntaxError: Unexpected token ILLEGAL
。
実行したいコマンドをファイルに入れ、それをデータベース名とともにシェルに渡し、出力をファイルにリダイレクトするだけです。したがって、findコマンドがfind.js
あり、データベースがのfoo
場合、次のようになります。
./mongo foo find.js >> out.json
out.json
。シェルのバージョンとデータベース名だけをに出力しました。mongo foo < find.js > out.json
働いた。
クエリ(例db.someCollection.find().pretty()
:)をJavaScriptファイルに書き込みますquery.js
。次に、コマンドを使用してオペレーティングシステムのシェルで実行します。
mongo yourDb < query.js > outputFile
クエリ結果は「outputFile」という名前のファイルになります。
デフォルトでは、Mongoは最初の20ドキュメントIIRCを印刷します。もっと必要な場合は、Mongoシェルでバッチサイズに新しい値を定義できます。
DBQuery.shellBatchSize = 100
。
.js
拡張機能によって誤解されないようにしてください。これらの素晴らしいmongoシェルクエリは、まったく変更せずに作成できます。
print
およびJSON.stringify
を使用すると、単純に有効な JSON
結果を生成できます。フラグを
使用--quiet
して、出力からシェルノイズをフィルタリングします。評価を避けるためにフラグを
使用します。(無効なJSON出力を生成する、使用するプリティフォーマッターが原因でそれを行わなければなりませんでした)ページングを回避するために、実際の結果の制限で置換を使用してください。--norc
.mongorc.js
DBQuery.shellBatchSize = ?
?
そして最後にtee
、ターミナル出力をファイルにパイプするために使用します:
// Shell:
mongo --quiet --norc ./query.js | tee ~/my_output.json
// query.js:
DBQuery.shellBatchSize = 2000;
function toPrint(data) {
print(JSON.stringify(data, null, 2));
}
toPrint(
db.getCollection('myCollection').find().toArray()
);
お役に立てれば!
また、そのためのmongoexportもありますが、どのバージョンが利用可能かわからないのでわかりません。
例:
mongoexport -d dbname -c collection --jsonArray --pretty --quiet --out output.json