MongoDB $addToSet 연산자란?
$addToSet 연산자는 배열에 값을 추가하는 연산자입니다. 단, 해당 값이 이미 배열에 존재하는 경우에는 아무 작업도 수행하지 않습니다. 이러한 특성 덕분에 중복 없는 고유한 값들의 집합(set)을 만들 때 매우 유용하게 사용됩니다.
이번 글에서는 $addToSet과 집계 파이프라인의 $group 단계를 조합하여, 컬렉션 내 특정 단일 필드(ProjectName)의 중복되지 않은 값들을 한 번에 가져오는 방법을 알아보겠습니다.
1. 샘플 컬렉션 생성
먼저 문서들이 담긴 컬렉션을 생성합니다.
> db.demo533.insertOne({"ProjectName":"Online Hospital Management"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e8b4cfaef4dcbee04fbbbfc")
}
> db.demo533.insertOne({"ProjectName":"Online Library Management"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e8b4d02ef4dcbee04fbbbfd")
}
> db.demo533.insertOne({"ProjectName":"Online Hospital Management"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e8b4d04ef4dcbee04fbbbfe")
}
> db.demo533.insertOne({"ProjectName":"Online Customer Tracker"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e8b4d0def4dcbee04fbbbff")
}위 예제에서 'Online Hospital Management' 프로젝트가 두 번 삽입된 점에 주목하세요. 이후 $addToSet이 어떻게 중복을 제거하는지 확인할 수 있습니다.
2. find() 메서드로 전체 문서 조회하기
find() 메서드를 사용하면 컬렉션의 모든 문서를 화면에 표시할 수 있습니다.
> db.demo533.find();
위 쿼리는 다음과 같은 결과를 출력합니다.
{ "_id" : ObjectId("5e8b4cfaef4dcbee04fbbbfc"), "ProjectName" : "Online Hospital Management" }
{ "_id" : ObjectId("5e8b4d02ef4dcbee04fbbbfd"), "ProjectName" : "Online Library Management" }
{ "_id" : ObjectId("5e8b4d04ef4dcbee04fbbbfe"), "ProjectName" : "Online Hospital Management" }
{ "_id" : ObjectId("5e8b4d0def4dcbee04fbbbff"), "ProjectName" : "Online Customer Tracker" }총 4개의 문서가 있으며, 그중 2개가 동일한 프로젝트 이름을 가지고 있는 것을 확인할 수 있습니다.
3. $addToSet으로 단일 필드의 고유 값 가져오기
다음은 $addToSet을 구현하여 ProjectName 필드의 값들을 가져오는 쿼리입니다. aggregate() 메서드 안에서 $group 단계를 사용하고, _id를 null로 지정하면 전체 문서를 하나의 그룹으로 묶어 처리할 수 있습니다.
> db.demo533.aggregate(
... [
... {
... $group:
... {
... _id:null,
... SetOfProject: { $addToSet: "$ProjectName" }
... }
... }
... ]
... )위 쿼리는 다음과 같은 결과를 출력합니다.
{ "_id" : null, "SetOfProject" : [ "Online Customer Tracker", "Online Library Management", "Online Hospital Management" ] }결과 분석
출력 결과를 보면 SetOfProject 배열에는 중복된 'Online Hospital Management'가 하나만 포함되어 있습니다. 원래 컬렉션에는 4개의 문서가 있었지만, $addToSet 덕분에 3개의 고유한 프로젝트 이름만 반환된 것입니다.
정리
$addToSet은 단독으로도 배열 업데이트에 활용되지만, $group 집계 단계와 함께 사용하면 SQL의 DISTINCT와 유사한 기능을 수행할 수 있습니다. 즉, MongoDB에서 단일 필드의 중복 없는 고유 값 목록을 가져오고 싶다면 aggregate() + $group + $addToSet 조합이 가장 간단하고 효율적인 방법입니다. 참고로 값의 개수만 필요하다면 $addToSet 대신 $sum: 1을 함께 사용해 세는 방법도 있습니다.