空对象{}是MongoDB中查询全部文档的标准写法,等价于SQL的SELECT *;省略参数未定义且各驱动行为不一,必须显式传入{}以确保兼容性与可靠性。

直接用 db.collection.find({}) 就能查出指定集合里的全部文档,这是最基础、最可靠的写法。空对象 {} 是 MongoDB 的“无条件”查询谓词,等价于 SQL 中的 SELECT * FROM table,但要注意它默认不带任何排序或限制。
为什么不能省略花括号?
有人会误写成 db.collection.find()(不带参数),这在旧版 mongosh 或某些驱动中可能返回空结果或报错。MongoDB 官方明确要求 find() 必须传入一个查询对象——哪怕它是空的 {}。省略参数的行为未定义,不同驱动表现不一(比如 PHP 驱动会抛 InvalidArgumentException)。
常见错误现象:
-
db.users.find()在 mongosh 里看似执行成功,但实际返回空游标(不输出任何文档) - Node.js 驱动中调用
collection.find()不传参数,会触发类型检查失败或运行时警告
如何避免查出太多数据卡死终端?
find({}) 可能一次性拉取几万条文档,mongosh 默认只显示前 20 条并提示 Type "it" for more,但如果你在脚本里遍历游标又没加 limit(),容易拖慢连接甚至 OOM。
实操建议:
- 调试时加
.limit(10):例如db.users.find({}).limit(10) - 生产环境绝不要裸用
find({}),必须配合sort()+limit()做分页,否则无法预测返回顺序(MongoDB 不保证自然顺序稳定) - 如果真要导出全量,用
mongoexport命令行工具更安全:mongoexport --db mydb --collection users --out users.json
PHP 和 Node.js 驱动中的写法差异
语法表层相似,但底层行为有关键区别:
- PHP:
$collection->find([])(空数组)是合法的,等价于{};但$collection->find(null)会报错 - Node.js:
collection.find({})是标准写法;collection.find()不传参会被视为语法错误(TypeScript 下直接编译失败) - 所有驱动中,
findOne({})都会返回集合里“第一个”匹配的文档(按索引或自然顺序),不是随机选——这点常被误认为是“随机取一条”
真正容易被忽略的是:空查询 {} 不等于“无筛选”,它只是不施加字段级约束;但索引选择、读关注(readConcern)、超时设置这些选项仍会生效。如果集合开启了分片,find({}) 还会触发广播查询——这时候性能开销和权限校验都比想象中更重。

















