具体来说,我想将mongodb find()
的结果打印到文件中。 JSON对象太大,因此我无法使用shell窗口大小查看整个对象。
答案 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)
使用print
和JSON.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