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

vip*_*per 98 javascript shell mongodb

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

Asy*_*sky 211

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

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

有两种方法可以解决这个问题.

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

$ mongo dbname << EOF > output.json
db.collection.find().pretty()
EOF
Run Code Online (Sandbox Code Playgroud)


(2)使用Javascript将a的结果find()转换为可打印的JSON

mongo dbname command.js > output.json
Run Code Online (Sandbox Code Playgroud)

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

printjson( db.collection.find().toArray() )
Run Code Online (Sandbox Code Playgroud)

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

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

$ mongo --quiet dbname --eval 'printjson(db.collection.find().toArray())' > output.json
Run Code Online (Sandbox Code Playgroud)

  • 如果你有超过一些结果,选项2确实是唯一的选择,因为在选项1中它只是停在'Type'它"for more". (2认同)
  • 不是真的@Tomty - shell批量的大小可以通过shell中的变量来控制.您可以将DBQuery.shellBatchSize = 10000放入.mongodbrc.js文件中,它将在10000结果后"停止"而不是20. (2认同)

Fal*_*mot 28

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

mongo | tee somefile
Run Code Online (Sandbox Code Playgroud)

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

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


Ada*_*ord 12

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

./mongo foo find.js >> out.json
Run Code Online (Sandbox Code Playgroud)

  • 这个答案是在 Go 和许多版本之前的工具被重写之前写的,除非你使用的是非常旧的东西,那么这可能就是为什么它不适合你 (2认同)

Joh*_*hnP 9

把你的查询(例如db.someCollection.find().pretty())放到javascript文件中,比方说吧query.js.然后使用命令在操作系统的shell中运行它:

mongo yourDb < query.js > outputFile

查询结果将位于名为"outputFile"的文件中.

默认情况下,Mongo打印出前20个文件IIRC.如果您需要更多,可以在Mongo shell中为批量大小定义新值,例如

DBQuery.shellBatchSize = 100.


Dmi*_*try 5

使用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()
);
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!


小智 5

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

> writeFile("/home/pahan/output.txt", tojson(db.myCollection.find().toArray()))
Run Code Online (Sandbox Code Playgroud)

Mongo shell 版本是 4.0.9


Jam*_*ang 5

在新的mongodb shell 5.0+ mongosh中,它集成了Node.js fs 模块,因此您只需在新的mongosh shell 中执行以下操作即可漂亮地打印输出:

fs.writeFileSync('output.json', JSON.stringify(db.test.find().toArray(), null, 2))
Run Code Online (Sandbox Code Playgroud)

不存在ObjectId已被剥离等问题,比printjson或好.pretty()

上面的代码可以按照描述来工作:

MongoDB Shell mongosh 是一个功能齐全的 JavaScript 和 Node.js 14.x REPL环境,用于与 MongoDB 部署交互。您可以使用 MongoDB Shell 直接对数据库测试查询和操作。

旧的mongoshell 也标记为Legacy,因此您应该转向这种新方式。