有没有办法“漂亮”打印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

使用printJSON.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() ); 

希望这可以帮助!