有没有办法“漂亮”打印MongoDB shell输出到文件?
具体来说,我想将一个mongodb find()
的结果打印到一个文件中。 JSON对象太大,所以我无法用shell窗口大小查看整个对象。
shell提供了一些很好但隐藏的function,因为它是一个交互式环境。
当你通过mongo commands.js从javascript文件运行命令时,你不会得到完全相同的行为。
有两种方法可以解决这个问题。
(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语句,你不必把它放在一个文件中,而是可以使用:
$ mongo --quiet dbname --eval 'printjson(db.collection.find().toArray())' > output.json
既然你是在terminal上这样做,只是想以一种理智的方式检查logging,你可以使用这样的技巧:
mongo | tee somefile
使用会话正常 – db.collection.find().pretty()
或任何你需要做的,忽略长输出,然后退出。 你的会议logging将在文件tee
写信给。
请注意,由于mongo shell期望交互式会话,输出可能包含转义序列和其他垃圾。 less
处理这些优雅。
只需将要运行的命令放入文件,然后将其与数据库名称一起传递到shell,并将输出redirect到文件。 所以,如果你的find命令是在find.js
而你的数据库是foo
,那么看起来像这样:
./mongo foo find.js >> out.json
把你的查询(例如db.someCollection.find().pretty()
)到一个javascript文件,比方说query.js
。 然后使用以下命令在您的操作系统的shell中运行它:
mongo yourDb < query.js > outputFile
查询结果将在名为“outputFile”的文件中。
默认情况下,Mongo打印出前20个文件IIRC。 如果你想要更多,你可以在Mongo shell中定义批量大小的新值,例如
DBQuery.shellBatchSize = 100
。
使用Asya Kamsky的这个答案 ,我为Windows编写了一行蝙蝠脚本。 这条线看起来像这样:
mongo --quiet %1 --eval "printjson(db.%2.find().toArray())" > output.json
然后可以运行它:
exportToJson.bat DbName CollectionName
使用print
和JSON.stringify
可以简单地生成一个有效的 JSON
结果。
使用--quiet
标志来滤除输出中的shell噪音。
使用--norc
标志来避免.mongorc.js
评估。 (我不得不这样做,因为我使用了一个漂亮的格式化器,这会产生无效的JSON输出)使用DBQuery.shellBatchSize = ?
replace?
以实际结果的限制来避免分页。
最后,使用tee
将terminal输出传送到一个文件:
// 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() );
希望这可以帮助!