Mognodb lookup을 활용한 데이터 조작: MongoDB Aggregate lookup

MongoDB logo
Photo by Rubaitul Azad / Unsplash

모던 개발 환경에서 데이터베이스는 필수 불가결한 요소입니다. MongoDB는 그 중에서도 확장성과 유연성을 제공하는 뛰어난 NoSQL 데이터베이스입니다. 오늘은 MongoDB의 강력한 특성 중 하나인 Aggregate와 Lookup을 활용해 데이터를 어떻게 더 효율적으로 조작할 수 있는지 알아보겠습니다.

목차

1. MongoDB Aggregate란?

개요

MongoDB에서 Aggregate는 컬렉션의 데이터를 다양한 방식으로 처리하고 분석하는 기능입니다. Aggregate 함수는 일련의 데이터 변환 연산(Stage)을 통과시켜 원하는 형태의 데이터를 생성할 수 있습니다.

주요 Aggregate 연산자

  • $match: 특정 조건에 맞는 문서만을 선택
  • $group: 문서를 특정 필드 기준으로 그룹화
  • $sort: 문서를 특정 필드로 정렬
  • $lookup: 다른 컬렉션과의 데이터를 조인

Aggregate의 강점은 이러한 연산자를 파이프라인 형태로 연결하여 복잡한 쿼리를 구성할 수 있다는 것입니다.

2. Lookup의 기본 구조와 작동 원리

Lookup이란?

Lookup은 SQL의 JOIN과 유사한 기능을 수행하는 Aggregate의 연산자입니다. Lookup을 이용하면 다른 컬렉션의 문서를 현재 컬렉션의 문서와 합칠 수 있습니다.

구조

Lookup의 기본 구조는 다음과 같습니다.

{
  $lookup: {
    from: "fromCollection",
    localField: "localField",
    foreignField: "foreignField",
    as: "outputArray"
  }
}

작동 원리

  1. from: 조인할 컬렉션을 지정합니다.
  2. localField: 현재 컬렉션의 필드를 지정합니다.
  3. foreignField: 조인할 컬렉션의 필드를 지정합니다.
  4. as: 결과를 저장할 필드 이름을 지정합니다.

3. 실전 예제: 복잡한 데이터 관계 표현

주문과 상품 데이터

가장 흔한 예로, Orders 컬렉션과 Products 컬렉션을 조인하여 주문 내역과 상품 정보를 한 번의 쿼리로 얻는 경우를 생각해보겠습니다.

db.Orders.aggregate([
  {
    $lookup: {
      from: "Products",
      localField: "product_id",
      foreignField: "_id",
      as: "ProductInfo"
    }
  }
])

결과 분석

이 쿼리를 실행하면, 각 주문 문서에 ProductInfo라는 필드가 추가되며, 해당 필드에는 조인된 상품 정보가 배열 형태로 저장됩니다.

4. 성능과 최적화: 주의점과 팁

Lookup의 성능

Lookup 연산은 비용이 많이 들 수 있으므로 주의가 필요합니다. 특히 대용량의 데이터를 다룰 때는 인덱스 설정이 중요합니다.

  1. 작은 컬렉션을 기준으로 조인을 실행하세요.
  2. $match 연산을 Lookup 이전에 배치하여 필요한 문서만 골라내세요.
  3. $project를 사용하여 필요한 필드만 출력하세요.

이렇게 MongoDB의 Aggregate와 Lookup을 활용하면, 복잡한 데이터 관계도 효율적으로 표현하고 분석할 수 있습니다. 다음에도 유용한 MongoDB 팁과 기법을 소개하겠습니다. 감사합니다.