😎

MongoDBでのJOIN

2021/06/23に公開

MongoDBではJOINができない、というのは古い知識であり、間違いです。
バージョン3.2から$lookupが導入され、JOINができるようになりました。

以下、例としてordersコレクションとproductsコレクションがある前提で、productsコレクションのデータをordersコレクションにJOINするサンプルを示します。

db.orders.aggregate([
  {
    $lookup: {
      from: 'products',
      localField: 'product_id', //ordersテーブルにあるフィールド
      foreignField: 'id', //productsテーブルにあるフィールド
      as: 'product'
    }
  }
])

SQL的に書き直すと以下のようになります。

SELECT *
FROM orders AS o
LEFT OUTER JOIN products AS p
ON o.product_id = p.id

注意点(SQL JOINとの相違点)として、$lookupでJOINしたフィールドは、対象のドキュメントが1つであっても必ずlistに格納されます。なので、1つにする場合は$unwindを使います。

db.orders.aggragate([
  {
    $lookup: {...}
  },
  {
    $unwind: 'product'
  }
])

Discussion