如何在 MongoDB shell 中打印出 20 多个项目(文档)?

Posted

技术标签:

【中文标题】如何在 MongoDB shell 中打印出 20 多个项目(文档)?【英文标题】:How to print out more than 20 items (documents) in MongoDB's shell? 【发布时间】:2011-04-11 22:55:45 【问题描述】:
db.foo.find().limit(300)

不会这样做。它仍然只打印出 20 个文档。

db.foo.find().toArray()
db.foo.find().forEach(printjson)

都将打印出每个文档的扩展视图,而不是 find() 的 1 行版本:

【问题讨论】:

默认情况下 mongo shell 只打印前 20 个文档,您可以通过在 shell 中键入 Type it 来获取下一批 20 个文档。以此类推。 【参考方案1】:

您可以在 shell 内部使用 it 来迭代接下来的 20 个结果。如果您看到“有更多”,只需输入 it,您就会看到接下来的 20 项。

【讨论】:

哦,这真的是关于如何在不使用it的情况下打印所有内容@ 谢谢halfdan,你的用户名是你的两倍! 整个想法是不要使用迭代器 我投了反对票,因为这是 OP 想要避免的(这是默认行为)。【参考方案2】:
DBQuery.shellBatchSize = 300

MongoDB Docs - Configure the mongo Shell - Change the mongo Shell Batch Size

【讨论】:

有没有办法让它持久化? @LukaszWiktor 是的,您可以创建一个 $HOME/.mongorc.js 文件并将该 shellBatchSize 设置放在那里。我的查询批量大小设置和 rs.slaveOk() 启用。通过命令行使用 --eval 时,它的用法也略有不同。见:docs.mongodb.com/manual/mongo/#mongorc-js-file 链接已过时,不包含此类信息。另外,我可以将它作为环境变量传递吗? 如果你想从命令行运行它,你可以这样做:mongo --eval "DBQuery.shellBatchSize = 100; db.foo.find()"【参考方案3】:

从你可以使用的外壳:

db.collection.find().toArray()

无需使用it即可显示所有文档。

【讨论】:

这个。如果您只想将它​​们全部放在一个外壳中以便您可以剪切和粘贴,这就足够了。 这正是为我所做的。说实话,我只需要一种方法来保存 Robomongo 输出的所有结果。谢谢! 太好了,它也让我把结果传给 jq :) Tee 结合使用可快速导出:mongo | tee ./myOutput.txt【参考方案4】:

总是可以的:

db.foo.find().forEach(function(f)print(tojson(f, '', true)););

获得紧凑的视图。

另外,我发现限制 find 返回的字段非常有用:

db.foo.find(,name:1).forEach(function(f)print(tojson(f, '', true)););

这将只返回 foo 中的 _id 和 name 字段。

【讨论】:

我喜欢这种方式,因为它可以在 shell 脚本中运行(带有 --eval 的 mongo 客户端) @ZhengKai 如果您使用的是脚本而不是在 shell 中,那么 shellBatchSize 不相关,因为 shell 不会为您迭代结果,您必须自己完成. tojson() 正是我想要从 DBQuery 转换它的东西,谢谢!【参考方案5】:

在 mongo shell 中,如果返回的游标未使用 var 关键字分配给变量,则游标会自动迭代以访问与查询匹配的前 20 个文档。您可以设置 DBQuery.shellBatchSize 变量来更改自动迭代文档的数量。

参考 - https://docs.mongodb.com/v3.2/reference/method/db.collection.find/

【讨论】:

【参考方案6】:

我建议你有一个~/.mongorc.js 文件,这样你就不必每次都设置默认大小。

 # execute in your terminal
 touch ~/.mongorc.js
 echo 'DBQuery.shellBatchSize = 100;' > ~/.mongorc.js
 # add one more line to always prettyprint the ouput
 echo 'DBQuery.prototype._prettyShell = true; ' >> ~/.mongorc.js

要了解更多关于你还能做什么,我建议你看看这篇文章:http://mo.github.io/2017/01/22/mongo-db-tips-and-tricks.html

【讨论】:

【参考方案7】:
show dbs

使用您的数据库名称 就我而言,我正在使用 - use smartbank 然后 - show collections - 只是检查文档集合名称。 最后,db. 你的收藏名称.find()find() -

show dbs

use smartbank

show collections

db.users.find() or db.users.find() or db.users.find(_id: ObjectId("60c8823cbe9c1c21604f642b")) or db.users.find().limit(20)

可以指定_id:ObjectId(这里写文档id)获取单个文档

或者您可以指定限制 - db.users.find().limit(20)

【讨论】:

【参考方案8】:

使用较新版本的 mongo shell (mongosh) 使用以下语法:

config.set("displayBatchSize", 300)

而不是折旧:

DBQuery.shellBatchSize = 300

未来的 find() 或 aggregate() 操作每次游标迭代只会返回 300 个文档。

【讨论】:

以上是关于如何在 MongoDB shell 中打印出 20 多个项目(文档)?的主要内容,如果未能解决你的问题,请参考以下文章

查找并打印出字符串中特定字符的出现次数 (shell/AIX)

linux shell脚本中如何统计某一行中某字符出现的个数

bash shell脚本,如何用sed 命令打印出匹配行和匹配行的第N行

MongoDB:如何在 MongoDB Shell 中删除集合的所有记录?

linux shell 脚本读取用户输入的参数如何解决?

用awk如何读取shell命令行上的参数(参数可以是带空格的)