有没有办法'漂亮'将MongoDB shell输出打印到文件?

时间:2012-10-27 22:40:51

标签: javascript mongodb shell

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

9 个答案:

答案 0 :(得分:198)

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

当您通过mongo commands.js从javascript文件运行命令时,您将无法获得完全相同的行为。

有两种解决方法。

(1)伪造shell并让它认为你处于交互模式

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


(2)使用Javascript将find()的结果翻译成可打印的JSON

mongo dbname command.js > output.json

其中command.js包含this(或其等价物):

printjson( db.collection.find().toArray() )

这将打印结果数组,包括[ ] - 如果你不希望你可以迭代数组并printjson()每个元素。

顺便说一句,如果您只运行一个Javascript语句,则不必将其放在文件中,而是可以使用:

$ mongo --quiet dbname --eval 'printjson(db.collection.find().toArray())' > output.json

答案 1 :(得分:28)

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

mongo | tee somefile

正常使用会话 - db.collection.find().pretty()或您需要做的任何事情,忽略长输出,然后退出。会话的成绩单将在tee写入的文件中。

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

答案 2 :(得分:12)

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

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

答案 3 :(得分:3)

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

希望这有帮助!

答案 4 :(得分:2)

使用Asya Kamsky的这个answer,我为Windows编写了一个单行的bat脚本。这条线看起来像这样:

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

然后可以运行它:

exportToJson.bat DbName CollectionName

答案 5 :(得分:1)

此外还有mongoexport,但我不确定自哪个版本可用。

示例:

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

答案 6 :(得分:0)

Neodan mongoexport的answer对于-q查询选项非常有用。它还将ObjectId转换为JSON "$oid"的标准格式。 E.g:

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

答案 7 :(得分:0)

我设法通过 writeFile()函数保存了结果。

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

Mongo shell版本是4.0.9

答案 8 :(得分:0)

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

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