106

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

4

11 に答える 11

228

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

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

これを回避するには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()

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

$ mongo --quiet dbname --eval 'printjson(db.collection.find().toArray())' > output.json
于 2012-10-28T17:16:13.067 に答える
30

これを端末で実行していて、レコードを適切な方法で検査したいだけなので、次のようなトリックを使用できます。

mongo | tee somefile

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

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

于 2014-05-23T21:34:57.010 に答える
13

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

./mongo foo find.js >> out.json
于 2012-10-28T00:26:37.960 に答える
11

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

mongo yourDb < query.js > outputFile

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

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

DBQuery.shellBatchSize = 100

于 2016-08-16T09:09:21.170 に答える
6

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

お役に立てれば!

于 2017-10-07T19:40:38.753 に答える
6

writeFile()関数で結果を保存することができました。

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

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

于 2019-05-08T21:26:31.297 に答える
2

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

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

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

exportToJson.bat DbName CollectionName

于 2016-08-23T09:27:49.223 に答える
1

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

例:

mongoexport -d dbname -c collection --jsonArray --pretty --quiet --out output.json
于 2017-11-23T08:47:39.370 に答える
1

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

mongoexport -d yourdb -c yourcol --jsonArray --pretty -q '{"field": "filter value"}' -o output.json
于 2018-06-07T03:09:21.990 に答える
1

新しいmongodbシェル5.0以降の mongoshでは、 Node.js fsモジュールが統合されているため、新しいmongoshシェルで以下を実行するだけで、出力をきれいに印刷できます。

fs.writeFileSync('output.json', JSON.stringify(db.test.find().toArray(), null, 2))

ObjectIdが剥がれているなどの問題もなく、printjsonまたはよりも優れてい.pretty()ます。

上記のコードは、説明が示すように機能します。

MongoDBシェル(mongosh)は、MongoDBデプロイメントと対話するための完全に機能するJavaScriptおよびNode.js14.xREPL環境です。MongoDBシェルを使用して、データベースで直接クエリと操作をテストできます。

古いmongoシェルもレガシーとしてマークされているので、この新しい方法に移動する必要があります。

于 2021-12-29T02:08:13.523 に答える
0

このコマンドを使用して、次のことを実行できます。

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

于 2020-06-08T12:29:18.137 に答える