$lookup (コレクション結合)
最終更新:2026-10-09
$lookup (コレクション結合)
$lookup は、現在のコレクションと別のコレクションの間で左外部結合を行い、一致したドキュメントを配列として各結果に付加します。SQL の LEFT JOIN に相当し、複数クエリを投げずにコレクション間のデータを組み合わせられます。なお等値マッチのみに対応し、範囲や条件付きの結合はできません。
| カテゴリ | コアステージ |
|---|---|
| MongoDB バージョン | 3.2+ |
| 例の言語 | mongosh(シェル) |
📝 構文
{ $lookup: { from: <collection>, localField: <local-field>, foreignField: <foreign-field>, as: <output-array> } }
▶ 例
以下のコマンドをローカルの mongosh で実行してください(mongod が起動済みである必要があります):
// $lookup: 注文と顧客を結合
db.orders.aggregate([
{ $lookup: {
from: "customers",
localField: "cust_id",
foreignField: "_id",
as: "customer"
} }
])
出力:
{ "_id": 1, "cust_id": "A123", "customer": [{ "_id": "A123", "name": "Alice" }] }
📌 注意事項
- from には同じデータベース内のコレクションを指定する
- フィールド名は完全一致が必要で、localField と foreignField の型も揃える
- 一致がなければ null ではなく空配列 [] になる
- 3.6 以降、$lookup はサブパイプライン(pipeline フィールド)でより高度な結合に対応。5.0 からは簡潔な相関サブクエリ構文で $expr が不要になった
🏷️ 関連タグ
💡 関連ケース
高度な集計パイプライン:複雑な式と変換
集計パイプライン入門:aggregateメソッドと基本ステージ
ブログコメントシステムCRUD実践
データベースとコレクション:MongoDBのストレージ単位
ドキュメントとBSON:MongoDBデータの基礎
$facet + $bucket + テキスト/地理空間検索
$lookupと複数コレクションの関連付け
Mongoose応用パターン:パフォーマンスと柔軟性
Mongooseスキーマ設計と埋め込み vs 参照
Mongooseバリデーションとミドルウェア
📚 関連チュートリアル
❓ よくある質問
Q$lookup はデータベースレベルの JOIN を置き換えられますか?
A同様の結果を得られますが、$lookup はクエリ時にデータを結合します。等値マッチとパイプライン内の単純な比較はインデックスを使えますが、結合最適化は SQL データベースほど包括的ではないため、大規模データでは性能を評価してください。
Q$lookup のパフォーマンスを最適化するには?
A結合先コレクションの外部キーにインデックスを作成します。また、パイプラインの先頭で $match を使い、結合前に主コレクションを小さくしておくのが効果的です。
Q$lookup は複数キーの結合に対応していますか?
Aはい。3.6 以降、$expr を使う $lookup のパイプライン形式で、単一キーの等値マッチを超えた複数フィールドの結合やサブクエリが可能です。