$lookup
1. $lookup ステージの概要
このアグリゲーションステージは、同一データベース内の別のコレクションに対して「左外部結合(左外部ジョイン / Left Outer Join)」を実行します。
$lookup を使用する際には、以下の 4 つの必須フィールドを指定する必要があります。
| フィールド | 説明 |
|---|---|
| from | 同一データベース内の、結合対象となる(ルックアップ先の)コレクションを指定します。 |
| localField | 入力側のコレクション(プライマリコレクション)にあるフィールドで、結合のキーとなるものを指定します。 |
| foreignField | 結合先(from で指定した)コレクションにあるフィールドで、結合のキーとなるものを指定します。 |
| as | 結合されたドキュメントを格納する、新しい配列フィールドの名前を指定します。 |
2. 実装例:コメントに映画情報を結合する
この例では、「アグリゲーション入門」セクションでロードしたサンプルデータセットの中から、sample_mflix データベースを使用します。
comments(コメント)コレクションのドキュメントに、対応する movies(映画)コレクションの詳細情報を結合してみましょう。
2.1 コード例
db.comments.aggregate([
{
// ステージ 1: movies コレクションから映画情報を取得して結合
$lookup: {
from: "movies", // 結合先コレクション
localField: "movie_id", // comments コレクション側の結合キー
foreignField: "_id", // movies コレクション側の結合キー
as: "movie_details", // 結合結果を格納する新しいフィールド名
},
},
{
// ステージ 2: 結果を 1 件に制限して確認
$limit: 1
}
])2.2 実行結果の解説
このクエリを実行すると、各コメントドキュメントの中に movie_details という名前の配列が新しく作成され、そこに movie_id と一致する _id を持った映画データが格納された状態で返されます。