MongoDBシェルの出力をファイルに「きれいに」印刷する方法はありますか?


101

具体的には、mongodbの結果をfind()ファイルに出力します。JSONオブジェクトが大きすぎるため、シェルウィンドウサイズではオブジェクト全体を表示できません。

回答:


216

シェルはインタラクティブな環境であるため、いくつかの優れた機能が隠されています。

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

command.jsは、現在のディレクトリに存在し、実行するJavaScriptを含む読み取り可能なファイルである必要があります。
Asya Kamsky 2013

リモートmongo dbの場合はどうすればよいですか?私は試しましたmongo blah.mongolab.com:33478/blah -u user -p pass --eval "my query" >> dump.txtが、それは私に与えましたJavaScript execution failed: SyntaxError: Unexpected token ILLEGAL
Sheharyar

このエラーは、-evalの後の引用符の内側が正しい構文ではないことを意味します。式全体の外側に一重引用符を使用することをお勧めします。その中に引用符が必要な場合は、二重引用符を使用してください。
Asya Kamsky 2014年

2
オプション1では「Type "it" for more」で停止するため、結果が少数の場合、オプション2が本当に唯一のオプションです。
Tomty

2
本当に@Tomtyではありません-シェルバッチのサイズは、シェル内の変数で制御できます。あなたの.mongodbrc.jsファイルにDBQuery.shellBatchSize = 10000を置くことができ、それが代わりに20の10000の結果の後に「ストップ」意志
アシャKamsky

29

これをターミナルで実行していて、レコードを正しい方法で検査したいので、次のようなトリックを使用できます。

mongo | tee somefile

通常どおりセッションを使用しdb.collection.find().pretty()ます- または必要なことは何でも、長い出力を無視して終了します。セッションの記録は、書き込まれたファイルに含まteeれます。

mongoシェルが対話型セッションを想定しているため、出力にはエスケープシーケンスやその他のガベージが含まれる可能性があることに注意してください。 lessこれらを優雅に扱います。


12

実行したいコマンドをファイルに入れ、それをデータベース名とともにシェルに渡し、出力をファイルにリダイレクトするだけです。したがって、findコマンドがfind.jsあり、データベースがのfoo場合、次のようになります。

./mongo foo find.js >> out.json

これは私にはうまくいきませんでしたout.json。シェルのバージョンとデータベース名だけをに出力しました。mongo foo < find.js > out.json働いた。
ジェームスブラウン

1
ツールが移動中に書き換えられた前にあなたは非常に古いものを使用していない限り、この答えは、のは、おそらくそれはあなたのために働いていない理由という、その後、多くのバージョン前に書かれた
アダムComerford

10

クエリ(例db.someCollection.find().pretty():)をJavaScriptファイルに書き込みますquery.js。次に、コマンドを使用してオペレーティングシステムのシェルで実行します。

mongo yourDb < query.js > outputFile

クエリ結果は「outputFile」という名前のファイルになります。

デフォルトでは、Mongoは最初の20ドキュメントIIRCを印刷します。もっと必要な場合は、Mongoシェルでバッチサイズに新しい値を定義できます。

DBQuery.shellBatchSize = 100


この。.js拡張機能によって誤解されないようにしてください。これらの素晴らしいmongoシェルクエリは、まったく変更せずに作成できます。
AD

4

printおよびJSON.stringifyを使用すると、単純に有効な JSON結果を生成できます。フラグを
使用--quietして、出力からシェルノイズをフィルタリングします。評価を避けるためにフラグを
使用します。(無効なJSON出力を生成する、使用するプリティフォーマッターが原因でそれを行わなければなりませんでした)ページングを回避するために、実際の結果の制限で置換を使用してください。--norc.mongorc.jsDBQuery.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()
);

お役に立てれば!


2

Asya Kamskyからのこの回答を使用して、Windows用の1行のバットスクリプトを作成しました。行は次のようになります。

mongo --quiet %1 --eval "printjson(db.%2.find().toArray())" > output.json

次に、それを実行できます:

exportToJson.bat DbName CollectionName


2

結果をwriteFile()関数で保存できました。

> writeFile("/home/pahan/output.txt", tojson(db.myCollection.find().toArray()))

Mongoシェルのバージョンは4.0.9でした


1

また、そのためのmongoexportもありますが、どのバージョンが利用可能かわからないのでわかりません。

例:

mongoexport -d dbname -c collection --jsonArray --pretty --quiet --out output.json

0

以下のような答え Neodanのmongoexportによってと非常に便利である-qクエリのためのオプション。またObjectId、JSONの標準形式に変換します"$oid"。例えば:

mongoexport -d yourdb -c yourcol --jsonArray --pretty -q '{"field": "filter value"}' -o output.json

0

あなたはそれを達成するためにこのコマンドを使うことができます:

mongo admin -u <userName> -p <password> --quiet --eval "cursor = rs.status(); printjson(cursor)" > output.json

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.