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)
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)
把你的查询(例如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()
);
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
在新的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 直接对数据库测试查询和操作。
旧的mongo
shell 也标记为Legacy,因此您应该转向这种新方式。
归档时间: |
|
查看次数: |
98558 次 |
最近记录: |