$graphLookup (グラフ検索)
最終更新:2026-10-09
$graphLookup (グラフ検索)
$graphLookup は、コレクション上で再帰検索を行い、グラフの走査をエミュレートします: connectFromField の値から開始して、maxDepth に達するか一致がなくなるまで connectToField を再帰的に一致させ、結果を as に格納します。組織図、カテゴリツリー、ホップ数のカウントに最適です。$lookup と違い、任意の深さを再帰できます。
| カテゴリ | 高度と診断 |
|---|---|
| MongoDB バージョン | 1.0+ |
| 例の言語 | mongosh(シェル) |
📝 構文
{ $graphLookup: { from: "<collection>", startWith: <expression>, connectFromField: "<field>", connectToField: "<field>", as: "<outputField>", maxDepth: <number>, depthField: "<depthField>" } }
⚙️ パラメータ
| from | 再帰検索の対象コレクション。 |
|---|---|
| startWith | 再帰を開始する値の式。 |
| connectFromField | 現在のドキュメントでマッチする値を持つフィールド。 |
| connectToField | 対象コレクションでマッチされるフィールド。 |
| as | 再帰結果を受け取るフィールド名。 |
| maxDepth | 最大再帰深度。省略した場合は無制限。 |
戻り値:各ドキュメントに再帰結果配列を付加したもの
▶ 例
以下のコマンドをローカルの mongosh で実行してください(mongod が起動済みである必要があります):
// $graphLookup: 従業員ごとの報告チェーンを構築
db.employees.aggregate([
{ $graphLookup: {
from: 'employees',
startWith: '$reportsTo',
connectFromField: 'reportsTo',
connectToField: 'name',
as: 'chain'
} }
])
出力:
// 各従業員ドキュメントにマネージャーの配列 chain が付く
📌 注意事項
- connectToField にインデックスを作成すると再帰が速くなる
- 結果には再帰的に一致したドキュメントが含まれ、開始ドキュメント自体は含まれない
- maxDepth 0 は 1 レベルだけ一致する
🏷️ 関連タグ
💡 関連ケース
さらなる実践ケースを近日公開予定。
📚 関連チュートリアル
❓ よくある質問
Q$graphLookup と $lookup の違いは?
A$lookup は 1 レベルだけ結合します。$graphLookup は複数レベルにわたって再帰します。
Q再帰は無限ループになりますか?
A一致がなくなるまで再帰し、maxDepth で上限を設定できます。
Q結果にドキュメント自身は含まれますか?
Aいいえ。startWith はシードで、結果はそれに一致した他のドキュメントです。