有没有办法将MongoDB shell的输出“漂亮”地打印到文件中?
在使用MongoDB shell时,有时候我们希望将输出结果以更漂亮的方式打印到文件中。有一种方法可以实现这个需求,即将要执行的命令放入一个文件中,然后将该文件与数据库名称一起传递给shell,并将输出重定向到一个文件中。例如,如果你的find命令在find.js文件中,数据库名称为foo,你可以这样做:
./mongo foo find.js >> out.json
然而,对于我来说,这种方法并没有起作用,只会将shell版本和数据库名称打印到out.json文件中。而将命令文件通过输入重定向传递给mongo命令,然后将输出重定向到文件中是有效的。具体操作如下:
mongo foo < find.js > out.json
需要注意的是,这个答案是在工具被重写为Go语言之前的很多版本中编写的。所以,如果你使用的是很旧的版本,可能就无法使用这种方法了。
在使用MongoDB shell时,有时候我们希望将输出结果以更美观的方式保存到文件中。下面的问题就是关于如何实现这一点的。
问题的解决方法是通过在命令中使用管道和tee命令。具体做法是运行mongo | tee somefile
,这样就能将MongoDB shell的输出结果保存到名为somefile的文件中。
在保存输出结果之后,我们可以像平常一样使用MongoDB shell会话,执行db.collection.find().pretty()
或其他需要的操作。然后忽略掉长长的输出结果,并退出MongoDB shell。此时,我们会在之前指定的文件中找到整个会话的记录。
需要注意的是,输出结果可能包含转义序列和其他垃圾字符,因为MongoDB shell期望一个交互式会话。不过,我们可以使用less
命令来优雅地处理这些问题。
通过以上的解决方法,我们可以将MongoDB shell的输出结果保存到文件中,并以更美观的方式查看和管理这些结果。
MongoDB的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包含以下内容(或者等效内容):
printjson(db.collection.find().toArray())
这将以漂亮的方式打印结果数组,包括[ ]
- 如果你不想要它,你可以迭代数组并对每个元素使用printjson()
。
顺便说一句,如果你只运行一个单独的Javascript语句,你不需要将它放在一个文件中,而是可以使用:
$ mongo --quiet dbname --eval 'printjson(db.collection.find().toArray())' > output.json
command.js必须是一个可读的文件,存在于当前目录中,并且其中包含你想要运行的javascript代码。
如何对远程mongo db执行此操作?我尝试了mongo blah.mongolab.com:33478/blah -u user -p pass --eval "my query" >> dump.txt
,但是它给了我JavaScript execution failed: SyntaxError: Unexpected token ILLEGAL
。
这个错误意味着在--eval后引号内的内容不是合法的语法。我建议在整个表达式外部使用单引号,如果需要在内部使用引号,使用双引号。
如果你有超过一小部分的结果,Option 2实际上是唯一的选择,因为在Option 1中它只会停在'Type "it" for more'。
不是真的,shell批处理的大小是可以通过shell内部的一个变量来控制的。你可以将DBQuery.shellBatchSize=10000放入你的.mongodbrc.js文件中,它将在获取10000个结果后"停止",而不是20个。
当然你可以,但是A) 在答案中没有提到这一点。B) 这仍然是有限制的。C) 为什么要这样做?出现这种情况是因为shell是交互式的,似乎没有必要"欺骗"它。
我同意欺骗它是"错误"的,但这是可能的。但这就是为什么我给出了不需要欺骗的"真实"答案。
太好了!我们应该在进入mongo之前运行它。
在compass中运行mogosh是否有办法访问这些功能?