有没有办法“漂亮”地将 MongoDB shell 输出打印到文件中?

IT技术 javascript mongodb shell
2021-03-07 04:00:05

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

6个回答

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
如果您有多个结果,则选项 2 实际上是唯一的选项,因为在选项 1 中,它只会停在“键入“它”以获得更多信息。
2021-04-16 04:00:05
如何为远程 mongo db 执行此操作?我试过了,mongo blah.mongolab.com:33478/blah -u user -p pass --eval "my query" >> dump.txt但它给了我JavaScript execution failed: SyntaxError: Unexpected token ILLEGAL
2021-04-18 04:00:05
该错误意味着 --eval 之后的引号内的内容是不合法的语法。我建议在整个表达式之外使用单引号,如果您需要在其中使用引号,请使用双引号。
2021-04-19 04:00:05
command.js 必须是一个可读文件,它存在于您的当前目录中,并且包含您要运行的 javascript。
2021-05-06 04:00:05
不是真的@Tomty - 外壳批次的大小可以通过外壳内部的变量进行控制。您可以将 DBQuery.shellBatchSize=10000 放入您的 .mongodbrc.js 文件中,它会在 10000 个结果而不是 20 个结果后“停止”。
2021-05-08 04:00:05

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

mongo | tee somefile

正常使用会话 -db.collection.find().pretty()或者无论您需要做什么,忽略长输出,然后退出。您的会话记录将在tee写入的文件中。

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

只需将您想要运行的命令放入一个文件中,然后将它与数据库名称一起传递给 shell,并将输出重定向到一个文件。因此,如果您的 find 命令在,find.js而您的数据库是foo,它看起来像这样:

./mongo foo find.js >> out.json
这对我不起作用,只将 shell 版本和数据库名称打印到out.json. mongo foo < find.js > out.json没有工作。
2021-04-16 04:00:05
这个答案是在 Go 和许多版本之前重写工具之前编写的,除非您使用的是非常旧的东西,否则这可能就是它不适合您的原因
2021-05-12 04:00:05

将您的查询(例如db.someCollection.find().pretty()放入一个 javascript 文件中,比如query.js. 然后使用以下命令在操作系统的 shell 中运行它:

mongo yourDb < query.js > outputFile

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

默认情况下,Mongo 打印出前 20 个文档 IIRC。如果你想要更多,你可以在 Mongo shell 中定义批量大小的新值,例如

DBQuery.shellBatchSize = 100.

这。不要被.js扩展误导您可以编写所有这些漂亮的 mongo shell 查询,而无需更改它们。
2021-05-10 04:00:05

使用printandJSON.stringify你可以简单地产生一个有效的 JSON结果。
使用--quietflag 从输出中过滤壳噪声。
使用--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()
);

希望这可以帮助!