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

MongoDB에서 배열 필드의 고유값(distinct) 목록 추출하기

MongoDB 배열 필드의 고유값 집계 개요

MongoDB에서 여러 문서에 걸쳐 배열 필드에 저장된 값들의 중복을 제거한 고유값(distinct) 목록을 얻어야 하는 경우가 자주 있습니다. 예를 들어 사용자 게시글 태그나 카테고리처럼 배열 형태로 저장된 데이터에서 전체 컬렉션 기준의 유니크한 값만 추출하고 싶을 때 distinct() 메서드를 활용할 수 있습니다.

이번 글에서는 실제 예제를 통해 컬렉션 생성부터 인덱스 설정, 그리고 배열 필드의 고유값 조회까지 단계별로 살펴보겠습니다.

1. 샘플 컬렉션 및 문서 생성

먼저 예제로 사용할 컬렉션을 만들고 몇 개의 문서를 삽입하겠습니다. 아래는 insertOne() 메서드를 이용해 문서를 추가하는 쿼리입니다.

> db.distinctAggregation.insertOne({"UserName":"Larry","UserPost":["Hi","Hello"]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c98aefb330fd0aa0d2fe4c6")
}
> db.distinctAggregation.insertOne({"UserName":"Chris","UserPost":["Hi","Good Morning"]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c98af0a330fd0aa0d2fe4c7")
}
> db.distinctAggregation.insertOne({"UserName":"Robert","UserPost":["Awesome"]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c98af1e330fd0aa0d2fe4c8")
}

2. 저장된 문서 확인

삽입된 모든 문서를 확인하려면 find() 메서드를 사용합니다.

> db.distinctAggregation.find().pretty();

위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.

{
   "_id" : ObjectId("5c98aefb330fd0aa0d2fe4c6"),
   "UserName" : "Larry",
   "UserPost" : [
      "Hi",
      "Hello"
   ]
}
{
   "_id" : ObjectId("5c98af0a330fd0aa0d2fe4c7"),
   "UserName" : "Chris",
   "UserPost" : [
      "Hi",
      "Good Morning"
   ]
}
{
   "_id" : ObjectId("5c98af1e330fd0aa0d2fe4c8"),
   "UserName" : "Robert",
   "UserPost" : [
      "Awesome"
   ]
}

출력 결과를 보면 세 명의 사용자가 각각 서로 다른 개수의 게시글 문자열을 배열 형태로 가지고 있으며, 일부 값(예: "Hi")은 여러 문서에 중복되어 있는 것을 확인할 수 있습니다.

3. 배열 필드에 인덱스 생성

배열 필드에 대한 조회 성능을 높이기 위해 인덱스를 생성합니다. ensureIndex()(또는 최신 버전에서는 createIndex())를 사용하면 됩니다.

> db.distinctAggregation.ensureIndex({"UserPost":1});
{
   "createdCollectionAutomatically" : false,
   "numIndexesBefore" : 1,
   "numIndexesAfter" : 2,
   "ok" : 1
}

실행 결과를 보면 인덱스 수가 1개에서 2개로 증가했으며, 이는 UserPost 필드에 오름차순 인덱스가 정상적으로 생성되었음을 의미합니다. 참고로 MongoDB는 멀티키(multikey) 인덱스 방식으로 배열의 각 요소에 대해 자동으로 인덱스를 관리합니다.

4. distinct()로 고유값 집계하기

이제 distinct() 메서드를 사용해 배열 필드의 중복 없는 고유값 목록을 조회합니다.

> db.distinctAggregation.distinct("UserPost");

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

[ "Awesome", "Good Morning", "Hello", "Hi" ]

정리

distinct() 메서드는 지정된 필드의 모든 값을 스캔한 후 중복을 제거하여 정렬된 배열 형태로 반환합니다. 배열 필드에 적용하면 각 문서 내부의 배열 요소들이 개별 값으로 처리되므로, 위 예제처럼 여러 문서에 흩어져 있던 "Hi", "Hello", "Good Morning", "Awesome"이 하나의 고유값 목록으로 깔끔하게 정리됩니다.

이 방식은 태그 시스템, 카테고리 분류, 통계 대상 값 추출 등 배열 데이터에서 유니크한 항목이 필요한 다양한 상황에서 유용하게 활용할 수 있습니다.