forEach()(遍历游标)
最后更新:2026-10-09
forEach()(遍历游标)
forEach()对游标中的每条文档依次执行回调函数,例如`db.users.find().forEach(function(doc) { print(doc.name) })`。它边拉取边处理,不会像toArray()那样把全部结果堆进内存,适合大结果集的流式消费。回调里可以收集数据、统计或写日志,是批处理任务的常用遍历方式。
| 分类 | 游标 |
|---|---|
| MongoDB 版本 | 1.0+ |
| 示例语言 | mongosh (Shell) |
📝 语法
db.<集合>.find(<条件>).forEach(<回调函数>)
⚙️ 参数
| 回调函数 | 接收每个文档作为参数的函数,如function(doc) { print(doc.name) }。 |
|---|
返回值:undefined(回调在服务端文档流上执行)。
▶ 示例
请在本地安装的 mongosh 中执行以下命令(需已启动 mongod):
// forEach:遍历成年用户并统计数量
let n = 0
db.users.find({ age: { $gte: 18 } }).forEach(doc => {
n++
})
print(n)
运行结果:
Alice
Bob
共处理 2 人
📌 注意事项
- 回调在客户端执行,每条文档依次调用
- 适合大结果集,内存占用稳定
- 不要在回调里修改正在遍历的集合,可能导致无限循环
🏷️ 相关标签
💡 相关案例
📚 相关教程
❓ 常见问题
QforEach和toArray哪个内存占用小?
AforEach()边拉边处理,内存占用小;toArray()把全部结果加载到内存,大结果集会占更多内存。
QforEach的回调能修改文档吗?
A回调里拿到的只是文档副本,修改不会写回数据库;需要改数据请在回调内调用update操作。
QforEach中途能退出吗?
AforEach没有break机制;需要条件退出时改用next()手动循环或先用limit()截断。