MongoDB $unwind 연산자란?
MongoDB의 $unwind 연산자는 배열 필드에 담긴 각 요소마다 별도의 문서를 반환하는 집계 단계입니다. 배열을 '풀어서(unwind)' 개별 값으로 분해하기 때문에, 배열 데이터를 그룹화하거나 필터링하는 등의 집계 작업에서 매우 유용하게 활용됩니다.
예제용 컬렉션 생성
개념을 이해하기 위해 먼저 문서 하나가 들어 있는 컬렉션을 만들어 보겠습니다. 컬렉션을 생성하는 쿼리는 다음과 같습니다.
> db.unwindOperatorDemo.insertOne({"StudentName":"Larry","StudentAge":23,"StudentSubject":["C","C++","Java","MongoDB"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c7ef5f3559dd2396bcfbfc8")
}find() 메서드로 문서 조회하기
find() 메서드를 사용하면 컬렉션의 모든 문서를 확인할 수 있습니다.
> db.unwindOperatorDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c7ef5f3559dd2396bcfbfc8"),
"StudentName" : "Larry",
"StudentAge" : 23,
"StudentSubject" : [
"C",
"C++",
"Java",
"MongoDB"
]
}$unwind 연산자 실행 예제
이제 $unwind 연산자를 적용해 보겠습니다. aggregate() 파이프라인에서 $project로 필요한 필드를 선택한 뒤, $unwind로 배열을 분해합니다.
> db.unwindOperatorDemo.aggregate(
... { $project : {
... StudentName : 1 ,
... StudentAge: 1 ,
... StudentSubject : 1
... }},
... { $unwind : "$StudentSubject" }
... ).pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c7ef5f3559dd2396bcfbfc8"),
"StudentName" : "Larry",
"StudentAge" : 23,
"StudentSubject" : "C"
}
{
"_id" : ObjectId("5c7ef5f3559dd2396bcfbfc8"),
"StudentName" : "Larry",
"StudentAge" : 23,
"StudentSubject" : "C++"
}
{
"_id" : ObjectId("5c7ef5f3559dd2396bcfbfc8"),
"StudentName" : "Larry",
"StudentAge" : 23,
"StudentSubject" : "Java"
}
{
"_id" : ObjectId("5c7ef5f3559dd2396bcfbfc8"),
"StudentName" : "Larry",
"StudentAge" : 23,
"StudentSubject" : "MongoDB"
}결과 해석
출력 결과를 보면 원래 하나의 문서였던 데이터가 StudentSubject 배열의 요소 수(4개)만큼 분리되었고, 각 문서마다 StudentName과 StudentAge 필드가 동일하게 매핑되어 있는 것을 확인할 수 있습니다. 이처럼 $unwind는 배열의 각 값을 기준으로 문서를 복제·분해하므로, 과목별 통계 집계나 배열 조건 검색 등에 폭넓게 활용할 수 있습니다.
참고: 빈 배열 및 null 값 처리
기본적으로 $unwind는 대상 필드가 없거나 null이거나 빈 배열인 문서를 결과에서 제외합니다. 이러한 문서도 결과에 유지하고 싶다면 다음과 같이 preserveNullAndEmptyArrays 옵션(MongoDB 3.2 이상)을 지정하면 됩니다.
{ $unwind: { path: "$StudentSubject", preserveNullAndEmptyArrays: true } }