forEach() (カーソルの反復)
最終更新:2026-10-09
forEach() (カーソルの反復)
forEach() はカーソル内のすべてのドキュメントに対してコールバックを実行します。例: `db.users.find().forEach(function(doc) { print(doc.name) })`。toArray() のようにすべてをメモリにバッファリングせず、取得しながら処理するため、大規模な結果セットに適したストリームフレンドリーな選択肢です。コールバックで収集、集計、ログ出力ができ、バッチジョブの定番です。
| カテゴリ | カーソル |
|---|---|
| MongoDB バージョン | 1.0+ |
| 例の言語 | mongosh(シェル) |
📝 構文
db.<collection>.find(<filter>).forEach(<callback>)
⚙️ パラメータ
| コールバック関数 | 各ドキュメントを受け取る関数(例: 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
Processed: 2
📌 注意事項
- コールバックはクライアント側でドキュメントごとに1回実行される
- メモリは一定に保たれる。大規模な結果セットに最適
- コールバック内で反復中のコレクションを変更しない。無限ループになり得る
🏷️ 関連タグ
💡 関連ケース
📚 関連チュートリアル
❓ よくある質問
QforEach と toArray ではどちらがメモリ消費が少ないですか?
AforEach() は取得しながら処理するためメモリ消費が少ないです。toArray() はすべてをメモリに読み込むため、大きなセットではコストがかかります。
QforEach のコールバックでドキュメントを変更できますか?
Aコールバックが受け取るのはコピーです。編集は永続化されません。変更を書き込むにはコールバック内で更新操作を呼びます。
QforEach を途中で抜けられますか?
AforEach には break がありません。条件付きで抜けるには next() で手動ループするか、先に limit() で件数を制限します。