mongodb의 Data join은 lookup!!

2023. 3. 10. 08:02mongodb

반응형

1. mongodb에서 lookup 은 join

MongoDB에서 $lookup은 Aggregation Pipeline의 stage 중 하나로, 다른 collection에서 데이터를 가져와서 Join을 수행할 수 있는 기능을 제공합니다. 이를 사용하여 RDBMS의 Join 기능과 유사한 기능을 구현할 수 있습니다.

2.lookup 문법

{ $lookup: {
    from: <collection to join>,
    localField: <field from the input documents>,
    foreignField: <field from the documents of the "from" collection>,
    as: <output array field>
}}

위의 구문에서 사용되는 각각의 파라미터는 다음과 같습니다.

  • from: Join할 collection의 이름을 지정합니다.
  • localField: 현재 collection의 Document에서 Join할 field의 이름을 지정합니다.
  • foreignField: Join할 collection의 Document에서 Join할 field의 이름을 지정합니다.
  • as: Join 결과를 저장할 배열 필드의 이름을 지정합니다.

3. 예제

  • orders Collection
db.orders.insertMany(
    [
        {
          "_id": ObjectId("602f425e4f8c14e7f5b15071"),
          "order_date": ISODate("2022-02-19T07:00:00Z"),
          "customer_id": ObjectId("602f425e4f8c14e7f5b15070"),
          "product_id": ObjectId("602f425e4f8c14e7f5b1506f")
        },
        {
          "_id": ObjectId("602f429f4f8c14e7f5b15073"),
          "order_date": ISODate("2022-02-20T07:00:00Z"),
          "customer_id": ObjectId("602f425e4f8c14e7f5b15070"),
          "product_id": ObjectId("602f425e4f8c14e7f5b1506e")
        }
    ]
)

  • customers Collection
db.customers.insertMany
(
    [
        {
          "_id": ObjectId("602f425e4f8c14e7f5b15070"),
          "name": "Alice",
          "age": 25
        },
        {
          "_id": ObjectId("602f42d54f8c14e7f5b15075"),
          "name": "Bob",
          "age": 30
        }
    ]
)

  • products Collection
db.products.insertMnay(
    [
        {
          "_id": ObjectId("602f425e4f8c14e7f5b1506e"),
          "name": "Product A",
          "price": 10
        },
        {
          "_id": ObjectId("602f425e4f8c14e7f5b1506f"),
          "name": "Product B",
          "price": 20
        }
    ]
)

위 예제 데이터는 orders, customers, products collection으로 구성되어 있습니다. orders collection의 Document는 customer_id 필드와 product_id 필드를 가지고 있습니다. 이 customer_id 필드는 customers collection의 _id 필드와, product_id 필드는 products collection의 _id 필드와 Join하려고 합니다.

  • orders + customers + products 하기!
db.orders.aggregate([
  {
    $lookup: {
      from: "customers",
      localField: "customer_id",
      foreignField: "_id",
      as: "customer"
    }
  },
  {
    $lookup: {
      from: "products",
      localField: "product_id",
      foreignField: "_id",
      as: "product"
    }
  }
])

위의 예제에서는 orders collection과 customers collection, products collection을 Join하였습니다. Join 결과는 각각 customer 배열 필드와 product 배열 필드에 저장됩니다.

이상 mongodb에서의 조인인 lookup에 대한 설명을 마무리하겠다.

반응형