有没有一种方法可以“漂亮”地打印MongoDB shell输出到文件?


101

具体来说,我想将mongodb的结果打印find()到文件中。JSON对象太大,因此无法使用shell窗口大小查看整个对象。

Answers:


216

Shell提供了一些不错的但隐藏的功能,因为它是一个交互式环境。

当您通过mongocommands.js从javascript文件运行命令时,您不会得到完全相同的行为。

有两种解决方法。

(1)伪造外壳并使它认为您处于交互模式

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


(2)使用Javascript将a的结果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

command.js必须是当前目录中存在的可读文件,并且具有要运行的javascript。
Asya Kamsky 2013年

如何为远程mongo数据库执行此操作?我试过了,mongo blah.mongolab.com:33478/blah -u user -p pass --eval "my query" >> dump.txt但是给了我JavaScript execution failed: SyntaxError: Unexpected token ILLEGAL
Sheharyar 2013年

该错误表示--eval之后引号内的内容不是合法语法。我建议在整个表达式之外使用单引号,如果您需要在其中使用双引号,则可以使用双引号。
Asya Kamsky 2014年

2
如果您拥有多个结果,那么选项2实际上是唯一的选择,因为在选项1中,它只会停在“键入“它”以获取更多”上。
Tomty,2015年

2
@Tomty不是真的-Shell批处理的大小可以通过Shell中的变量来控制。你可以把DBQuery.shellBatchSize = 10000到您的.mongodbrc.js文件,它会“停”后,10000项,而不是20
阿霞甘维珍

29

由于您是在终端上执行此操作,并且只想以合理的方式检查记录,因此可以使用以下技巧:

mongo | tee somefile

照常使用会话- db.collection.find().pretty()或您需要执行的任何操作,忽略冗长的输出并退出。您会话的成绩单将在tee写入的文件中。

请注意,由于mongo shell期望进行交互式会话,因此输出可能包含转义序列和其他垃圾。 less优雅地处理这些。


12

只需将要运行的命令放入文件中,然后将其与数据库名称一起传递到外壳并将输出重定向到文件。因此,如果您的find命令位于find.js并且数据库为foo,则它将看起来像这样:

./mongo foo find.js >> out.json

这对我不起作用,仅将shell版本和数据库名称打印到out.jsonmongo foo < find.js > out.json做过。
詹姆斯·布朗

1
这个答案是在Go和许多版本中的工具重写之前写的,除非您使用的是非常老的东西,否则这可能就是为什么它不适合您的原因
Adam Comerford,

10

db.someCollection.find().pretty()假设您的查询(例如)到一个javascript文件query.js。然后使用以下命令在操作系统的外壳中运行它:

mongo yourDb < query.js > outputFile

查询结果将在名为“ outputFile”的文件中。

默认情况下,Mongo会打印出前20个文档IIRC。如果需要更多,可以在Mongo Shell中为批次大小定义新值,例如

DBQuery.shellBatchSize = 100


这个。不要被.js扩展误导。您可以编写所有这些不错的mongo shell查询,而无需完全更改它们。
公元

4

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

希望这可以帮助!


2

使用Asya Kamsky的答案,我为Windows编写了一个单行的bat脚本。该行如下所示:

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

然后可以运行它:

exportToJson.bat DbName CollectionName


2

我设法用writeFile()函数保存结果。

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

Mongo Shell版本为4.0.9


1

也有针对此的mongoexport,但由于该版本可用,我不确定。

例:

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

0

作为Neodan的回答,mongoexport -q对于查询选项非常有用。它还可以转换ObjectId为JSON的标准格式"$oid"。例如:

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

0

您可以使用以下命令来实现它:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.