MongoDB에서 하나의 문서를 그 안에 포함된 하위 문서 또는 배열 요소를 기준으로 나누고 싶다면 $unwind 연산자를 사용하면 됩니다. 이 글에서는 실제 예제를 통해 $unwind의 동작 방식을 단계별로 살펴보겠습니다.
1. 예제 컬렉션 생성
먼저 테스트에 사용할 컬렉션을 만들어 보겠습니다.
> db.demo276.insertOne({"Name":"Chris","Subjects":["MySQL","MongoDB"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e48f953dd099650a5401a51")
}2. 저장된 문서 확인
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.
> db.demo276.find().pretty();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : ObjectId("5e48f953dd099650a5401a51"),
"Name" : "Chris",
"Subjects" : [
"MySQL",
"MongoDB"
]
}현재 'Subjects' 필드에는 두 개의 값이 담긴 배열이 들어 있는 것을 확인할 수 있습니다.
3. $unwind로 문서 분할하기
이제 aggregate() 메서드와 함께 $unwind를 사용하여 배열을 기준으로 문서를 분할해 보겠습니다.
> db.demo276.aggregate( [ { $unwind : "$Subjects" } ] )실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e48f953dd099650a5401a51"), "Name" : "Chris", "Subjects" : "MySQL" }
{ "_id" : ObjectId("5e48f953dd099650a5401a51"), "Name" : "Chris", "Subjects" : "MongoDB" }$unwind 동작 원리 정리
$unwind는 애그리게이션 파이프라인의 한 단계로, 지정한 배열 필드의 각 요소마다 별도의 문서를 생성합니다. 위 예제에서는 'Subjects' 배열에 "MySQL"과 "MongoDB"라는 두 개의 값이 있었기 때문에, 원본 문서 하나가 각각 다른 과목 값을 가진 두 개의 문서로 분할되었습니다.
이처럼 $unwind를 활용하면 배열 형태로 저장된 데이터를 개별 문서 단위로 편하게 처리할 수 있으며, 이후 $group, $match 등 다른 파이프라인 단계와 조합하면 더욱 강력한 데이터 집계와 분석이 가능합니다.