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

MongoDB에서 배열 필드의 고유한 값 추출하기 – $addToSet 활용법

MongoDB에서 배열 필드에 포함된 고유한(distinct) 값을 추출하고 싶다면, $addToSet 연산자를 활용한 집계(aggregation) 쿼리를 사용하는 것이 가장 효과적입니다. 이 글에서는 실제 예제를 통해 그 방법을 단계별로 살펴보겠습니다.

1. 샘플 컬렉션 생성

먼저 데모용 컬렉션을 만들고 문서를 삽입해 보겠습니다. 아래 예제에서는 각 문서가 숫자 배열을 담고 있는 "ListOfValues" 필드를 가지도록 구성했습니다.

> db.demo122.insertOne({"ListOfValues":[100,10]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e2f20f1140daf4c2a3544b6")
}
> db.demo122.insertOne({"ListOfValues":[240,10]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e2f20f7140daf4c2a3544b7")
}

2. 저장된 문서 확인

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

> db.demo122.find();

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

{ "_id" : ObjectId("5e2f20f1140daf4c2a3544b6"), "ListOfValues" : [ 100, 10 ] }
{ "_id" : ObjectId("5e2f20f7140daf4c2a3544b7"), "ListOfValues" : [ 240, 10 ] }

3. $addToSet으로 고유한 배열 값 추출하기

이제 aggregate() 메서드와 함께 $group 단계와 $addToSet 연산자를 조합하여 배열 필드의 고유한 값들을 추출해 보겠습니다. _id를 0으로 지정하면 전체 컬렉션이 하나의 그룹으로 묶여 처리됩니다.

> db.demo122.aggregate([
...    {
...       "$group": {
...          "_id": 0,
...          "ListOfValues": { "$addToSet": "$ListOfValues" }
...       }
...    }
... ])

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

{ "_id" : 0, "ListOfValues" : [ [ 240, 10 ], [ 100, 10 ] ] }

마무리

$addToSet은 중복을 허용하지 않는 집합(set)처럼 동작하기 때문에, 배열 필드에서 고유한 값만 깔끔하게 모아야 할 때 매우 유용합니다. 참고로 배열 내부의 개별 요소를 기준으로 고유 값을 뽑아내고 싶다면, 먼저 $unwind로 배열을 펼친 뒤 $addToSet을 적용하는 방법도 활용할 수 있습니다.