web-dev-qa-db-ja.com

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

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

95
viper

シェルは、インタラクティブな環境であるため、いくつかの素晴らしい機能を提供します。

Mongo commands.jsを介してjavascriptファイルからコマンドを実行すると、まったく同じ動作をすることはありません。

これには2つの方法があります。

(1)シェルを偽造して、対話モードにあると思わせる

$ mongo dbname << EOF > output.json
db.collection.find().pretty()
EOF

または
(2)Javascriptを使用してfind()の結果を印刷可能なJSONに変換します

mongo dbname command.js > output.json

command.jsには、これ(または同等のもの)が含まれています。

printjson( db.collection.find().toArray() )

これは[ ]を含む結果の配列をきれいに出力します-配列と各要素をprintjson()繰り返したくない場合。

ところで、1つのJavascriptステートメントだけを実行している場合は、ファイルに置く必要はなく、代わりに次を使用できます。

$ mongo --quiet dbname --eval 'printjson(db.collection.find().toArray())' > output.json
204
Asya Kamsky

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

mongo | tee somefile

通常どおりセッションを使用します-db.collection.find().pretty()または必要な操作をすべて実行し、長い出力を無視して終了します。セッションのトランスクリプトは、teeに書き込まれたファイルにあります。

Mongoシェルが対話型セッションを予期しているため、出力にエスケープシーケンスやその他のゴミが含まれている可能性があることに注意してください。 lessはこれらを適切に処理します。

28
Falcon Momot

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

./mongo foo find.js >> out.json
12
Adam Comerford

クエリ(たとえばdb.someCollection.find().pretty())をjavascriptファイルに入れて、たとえばquery.jsとしましょう。次に、コマンドを使用して、オペレーティングシステムのシェルで実行します。

mongo yourDb < query.js > outputFile

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

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

DBQuery.shellBatchSize = 100

9
JohnP

printおよびJSON.stringifyを使用すると、単純に有効JSON結果を生成できます。
--quietフラグを使用して、出力からシェルノイズをフィルタリングします。
--norc評価を回避するには、.mongorc.jsフラグを使用します。 (使用するプリティフォーマッターのために、無効なJSON出力が生成されるため、これを実行する必要がありました)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()
);

お役に立てれば!

3
Dmitry

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

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

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

exportToJson.bat DbName CollectionName

2
margaretkru

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

例:

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

Neodan mongoexportによる answer は、クエリの-qオプションで非常に便利です。また、ObjectIdをJSONの標準形式"$oid"に変換します。例えば:

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

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

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

Mongo Shellバージョンは4.0.9でした

0
Pavel_H