具体的には、mongodbの結果をfind()
ファイルに出力したいと思います。JSONオブジェクトが大きすぎるため、シェルウィンドウサイズでオブジェクト全体を表示できません。
11 に答える
シェルはインタラクティブな環境であるため、いくつかの優れた機能を提供します。
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
これを端末で実行していて、レコードを適切な方法で検査したいだけなので、次のようなトリックを使用できます。
mongo | tee somefile
通常どおりセッションを使用します-db.collection.find().pretty()
または必要なことは何でも、長い出力を無視して終了します。セッションのトランスクリプトは、書き込まれたファイルにtee
含まれます。
mongoシェルが対話型セッションを想定しているため、出力にエスケープシーケンスやその他のガベージが含まれる可能性があることに注意してください。 less
これらを優雅に処理します。
実行するコマンドをファイルに入れて、データベース名と一緒にシェルに渡し、出力をファイルにリダイレクトするだけです。したがって、findコマンドがfind.js
あり、データベースがfoo
の場合、次のようになります。
./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
。
を使用するprint
と、有効な結果JSON.stringify
を簡単に生成できます。フラグを
使用して、出力からのシェルノイズをフィルタリングします。評価を避けるためにフラグを
使用してください。(使用しているプリティフォーマッターが無効なJSON出力を生成するため、これを行う必要がありました)ページングを回避するために、実際の結果の制限に置き換えて使用します。 JSON
--quiet
--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()
);
お役に立てれば!
writeFile()関数で結果を保存することができました。
> writeFile("/home/pahan/output.txt", tojson(db.myCollection.find().toArray()))
Mongoシェルのバージョンは4.0.9でした
Asya Kamskyからのこの回答を使用して、Windows用の1行のbatスクリプトを作成しました。行は次のようになります。
mongo --quiet %1 --eval "printjson(db.%2.find().toArray())" > output.json
次に、それを実行できます。
exportToJson.bat DbName CollectionName
そのためのmongoexportもありますが、どのバージョンが利用可能かはわかりません。
例:
mongoexport -d dbname -c collection --jsonArray --pretty --quiet --out output.json
Neodanによる回答として、mongoexportは-q
クエリのオプションで非常に便利です。またObjectId
、JSONの標準形式に変換します"$oid"
。例えば:
mongoexport -d yourdb -c yourcol --jsonArray --pretty -q '{"field": "filter value"}' -o output.json
新しい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
シェルもレガシーとしてマークされているので、この新しい方法に移動する必要があります。
このコマンドを使用して、次のことを実行できます。
mongo admin -u <userName> -p <password> --quiet --eval "cursor = rs.status(); printjson(cursor)" > output.json