MongoDB에서 여러 배열을 하나의 배열로 만들기
여러 배열에 담긴 요소들을 개별 값으로 분리하려면 MongoDB의 $unwind 연산자를 aggregate(집계)와 함께 사용하면 됩니다. $unwind는 배열 필드를 입력받아 각 요소마다 하나의 문서를 출력해 주는 아주 유용한 기능입니다.
먼저 문서가 포함된 컬렉션을 생성해 보겠습니다.
1단계: 컬렉션 생성 및 문서 삽입
> db.demo289.insertOne({"Section":["A","B","E"],"Name":"Chris"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e4c06fcf49383b52759cbc3")
}
> db.demo289.insertOne({"Section":["C","D","B"],"Name":"David"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e4c070af49383b52759cbc4")
}2단계: find() 메서드로 문서 확인
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.
> db.demo289.find().pretty();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : ObjectId("5e4c06fcf49383b52759cbc3"),
"Section" : [ "A", "B", "E" ],
"Name" : "Chris"
}
{
"_id" : ObjectId("5e4c070af49383b52759cbc4"),
"Section" : [ "C", "D", "B" ],
"Name" : "David"
}3단계: $unwind를 사용한 배열 분리 쿼리
다음은 MongoDB에서 여러 배열의 요소를 개별 문서로 분리하는 쿼리입니다.
> db.demo289.aggregate({ $unwind : "$Section" } );실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e4c06fcf49383b52759cbc3"), "Section" : "A", "Name" : "Chris" }
{ "_id" : ObjectId("5e4c06fcf49383b52759cbc3"), "Section" : "B", "Name" : "Chris" }
{ "_id" : ObjectId("5e4c06fcf49383b52759cbc3"), "Section" : "E", "Name" : "Chris" }
{ "_id" : ObjectId("5e4c070af49383b52759cbc4"), "Section" : "C", "Name" : "David" }
{ "_id" : ObjectId("5e4c070af49383b52759cbc4"), "Section" : "D", "Name" : "David" }
{ "_id" : ObjectId("5e4c070af49383b52759cbc4"), "Section" : "B", "Name" : "David" }결과를 보면 각 문서의 Section 배열이 개별 요소(A, B, E / C, D, B)로 나뉘어, 원본 문서당 배열 요소 수만큼 문서가 생성된 것을 확인할 수 있습니다. 이처럼 $unwind는 배열 데이터를 정규화하거나 그룹화($group) 전 전처리 작업을 할 때 매우 유용하게 활용됩니다.