MongoDB에서 특정 필드의 값이 동일한 문서들을 하나로 묶어 그룹화하고 싶다면 집계 파이프라인(Aggregation Pipeline)의 $group 단계와 $addToSet 연산자를 함께 사용하면 됩니다. $addToSet은 중복을 허용하지 않는 배열에 값을 추가해 주기 때문에, 같은 키 값에 속한 여러 문서의 데이터를 깔끔하게 모아 줍니다.
1. 샘플 컬렉션 생성하기
먼저 실습에 사용할 컬렉션을 만들고 문서를 삽입하겠습니다.
> db.findDocumentWithCommonFieldsDemo.insertOne(
{
"UserId":1,
"UserName":"Carol"
}
);
{
"acknowledged" : true,
"insertedId" : ObjectId("5cdf8ebebf3115999ed51200")
}
> db.findDocumentWithCommonFieldsDemo.insertOne(
{
"UserId":2,
"UserName":"David"
}
);
{
"acknowledged" : true,
"insertedId" : ObjectId("5cdf8ebebf3115999ed51201")
}
>
> db.findDocumentWithCommonFieldsDemo.insertOne(
{
"UserId":1,
"UserName":"Sam"
}
);
{
"acknowledged" : true,
"insertedId" : ObjectId("5cdf8ebebf3115999ed51202")
}위 예제에서는 UserId가 1인 사용자가 두 명(Carol, Sam)이고, UserId가 2인 사용자가 한 명(David)입니다.
2. 저장된 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.
> db.findDocumentWithCommonFieldsDemo.find();
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5cdf8ebebf3115999ed51200"), "UserId" : 1, "UserName" : "Carol" }
{ "_id" : ObjectId("5cdf8ebebf3115999ed51201"), "UserId" : 2, "UserName" : "David" }
{ "_id" : ObjectId("5cdf8ebebf3115999ed51202"), "UserId" : 1, "UserName" : "Sam" }3. $group과 $addToSet으로 공통 필드 기준 그룹화
이제 $group 단계에서 _id를 $UserId로 지정하고, $addToSet을 이용해 각 그룹에 속한 UserName 값들을 배열로 수집합니다.
> db.findDocumentWithCommonFieldsDemo.aggregate({$group : {_id : "$UserId", "UserDetails": {$addToSet : "$UserName"}}});실행 결과는 다음과 같습니다.
{ "_id" : 2, "UserDetails" : [ "David" ] }
{ "_id" : 1, "UserDetails" : [ "Sam", "Carol" ] }결과 해석
출력 결과를 보면 UserId가 1인 문서들은 하나의 그룹으로 묶여 UserDetails 배열에 ["Sam", "Carol"]이 담겼고, UserId가 2인 문서는 ["David"]로 그룹화된 것을 확인할 수 있습니다.
참고로 $addToSet은 집합(set)처럼 동작하기 때문에 동일한 값이 여러 번 나타나더라도 배열에 한 번만 저장됩니다. 만약 중복 값을 그대로 유지하고 싶다면 $push 연산자를 대신 사용하면 됩니다.