具体来说,我想将 mongodb 的结果打印find()
到文件中。JSON 对象太大,因此我无法使用外壳窗口大小查看整个对象。
有没有办法“漂亮”地将 MongoDB shell 输出打印到文件中?
shell 提供了一些不错但隐藏的功能,因为它是一个交互式环境。
当您通过 mongo commands.js 从 javascript 文件运行命令时,您不会得到完全相同的行为。
有两种方法可以解决这个问题。
(1) 伪造 shell 并让它认为您处于交互模式
$ 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
由于您在终端上执行此操作并且只想以理智的方式检查记录,您可以使用这样的技巧:
mongo | tee somefile
正常使用会话 -db.collection.find().pretty()
或者无论您需要做什么,忽略长输出,然后退出。您的会话记录将在tee
写入的文件中。
请注意,由于 mongo shell 需要交互式会话,因此输出可能包含转义序列和其他垃圾。 less
优雅地处理这些。
只需将您想要运行的命令放入一个文件中,然后将它与数据库名称一起传递给 shell,并将输出重定向到一个文件。因此,如果您的 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
.
使用print
andJSON.stringify
你可以简单地产生一个有效的 JSON
结果。
使用--quiet
flag 从输出中过滤壳噪声。
使用--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()
);
希望这可以帮助!