Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB에서 배열의 고유한 항목을 결합하는 방법

MongoDB에서 여러 배열에 흩어져 있는 값들을 하나로 모은 뒤, 중복을 제거하고 고유한(unique) 항목만 추출하고 싶다면 aggregate() 메서드를 활용하면 됩니다. 이 글에서는 실제 예제를 통해 배열 내 고유 항목을 결합하는 전체 과정을 단계별로 살펴보겠습니다.

1. 샘플 컬렉션 생성하기

먼저 데모용 컬렉션을 만들고 두 개의 문서를 삽입합니다. 각 문서에는 서로 다른 필드명(details, Info)으로 배열이 저장되어 있습니다.

> db.demo420.insert(
...     {
...         "details" : [
...             {
...                 "Value1":10,
...                 "Value2":20,
...                 "Value3":30
...             }
...         ]
...     }
... )
WriteResult({ "nInserted" : 1 })
> db.demo420.insert(
...     {
...         "Info" : [
...             {
...                 "Value1":10,
...                 "Value2":20,
...                 "Value3":300
...             }
...         ]
...     }
... )
WriteResult({ "nInserted" : 1 })

2. 저장된 문서 확인하기

find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.

> db.demo420.find();

위 명령을 실행하면 다음과 같은 결과가 출력됩니다.

{ "_id" : ObjectId("5e739a569822da45b30346dc"), "details" : [ { "Value1" : 10, "Value2" : 20, "Value3" : 30 } ] }
{ "_id" : ObjectId("5e739a569822da45b30346dd"), "Info" : [ { "Value1" : 10, "Value2" : 20, "Value3" : 300 } ] }

3. 배열의 고유 항목을 결합하는 쿼리

이제 여러 배열의 값을 하나로 합치고 중복을 제거하는 애그리게이션 쿼리를 살펴보겠습니다.

> db.demo420.aggregate([
...     { "$project": {
...         "_id": 0,
...         "unique": {
...             "$filter": {
...                 "input": {
...                     "$setDifference": [
...                         { "$concatArrays": [
...                             "$Info.Value1",
...                             "$Info.Value2",
...                             "$Info.Value3"
...                         ]},
...                         []
...                     ]
...                 },
...                 "cond": { "$ne": [ "$$this", "" ] }
...             }
...         }
...     }},
...     { "$unwind": "$unique" },
...     { "$group": {
...         "_id": null,
...         "uniqueArray": { "$addToSet": "$unique" }
...     }}
... ])

실행 결과는 다음과 같습니다.

{ "_id" : null, "uniqueArray" : [ 300, 20, 10 ] }

쿼리 동작 원리

각 파이프라인 단계가 어떤 역할을 하는지 정리하면 다음과 같습니다.

  • $concatArrays: Value1, Value2, Value3처럼 여러 배열의 값을 하나의 배열로 연결합니다.
  • $setDifference: 배열과 빈 배열([])의 차집합을 계산합니다. 집합 연산 특성상 자동으로 중복 요소가 제거되므로, 사실상 중복 제거 용도로 활용됩니다.
  • $filter: 빈 문자열("")과 같은 불필요한 값을 걸러냅니다.
  • $unwind: 배열을 개별 문서 단위로 분해하여 이후 그룹화 작업을 가능하게 합니다.
  • $group + $addToSet: 분해된 값들을 다시 하나의 집합으로 수집하며, 이 단계에서도 중복 없는 고유 값만 유지됩니다.

이처럼 $concatArrays로 배열을 합친 뒤 $setDifference$addToSet을 조합하면, MongoDB에서 손쉽게 중복 없는 고유 항목 목록을 얻을 수 있습니다. 데이터 정제나 통계 집계 작업에서 매우 유용하게 활용할 수 있는 패턴이니 참고해 보시기 바랍니다.