MongoDB에서 여러 문서의 특정 필드 값을 하나의 배열 형태로 반환하고 싶다면 집계(Aggregation) 기능을 활용하면 됩니다. $group 단계와 $addToSet 연산자를 함께 사용하면 각 문서에 흩어져 있는 값들을 손쉽게 하나의 배열로 모을 수 있습니다.
1. 샘플 컬렉션 생성
먼저 실습에 사용할 컬렉션을 만들고 문서를 삽입해 보겠습니다.
> db.specifyReturnFormatDemo.insertOne({"Subject":"MongoDB"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cefd364ef71edecf6a1f6c0")
}
> db.specifyReturnFormatDemo.insertOne({"Subject":"MySQL"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cefd369ef71edecf6a1f6c1")
}
> db.specifyReturnFormatDemo.insertOne({"Subject":"SQL Server"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cefd36fef71edecf6a1f6c2")
}2. 저장된 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.
> db.specifyReturnFormatDemo.find();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
출력 결과
{ "_id" : ObjectId("5cefd364ef71edecf6a1f6c0"), "Subject" : "MongoDB" }
{ "_id" : ObjectId("5cefd369ef71edecf6a1f6c1"), "Subject" : "MySQL" }
{ "_id" : ObjectId("5cefd36fef71edecf6a1f6c2"), "Subject" : "SQL Server" }3. 집계 파이프라인으로 배열 형식 지정하기
이제 aggregate() 메서드를 사용해 Subject 필드의 값들을 하나의 배열로 묶어 반환해 보겠습니다. $group에서 _id를 0으로 설정하면 전체 문서를 하나의 그룹으로 묶고, $addToSet이 중복 없이 각 값을 배열에 추가합니다. 마지막으로 $project 단계에서 불필요한 _id 필드를 제외합니다.
> db.specifyReturnFormatDemo.aggregate([
{
"$group": {
"_id": 0,
"Subject": {
"$addToSet": "$Subject"
}
}
},
{
"$project": {
"_id": 0,
"Subject": 1
}
}
]);출력 결과
{ "Subject" : [ "SQL Server", "MySQL", "MongoDB" ] }실행 결과를 보면 세 개의 개별 문서에 담겨 있던 과목 이름들이 하나의 배열로 깔끔하게 반환된 것을 확인할 수 있습니다.
참고 사항
$addToSet은 중복 값을 자동으로 제거하며, 배열 내 요소의 순서는 보장되지 않습니다. 만약 중복 값을 포함한 채 순서대로 배열을 만들고 싶다면 $push 연산자를 대신 사용하면 됩니다. 또한 MongoDB 5.0 이상에서는 $documents, $sort 등의 단계를 조합해 원하는 순서로 정렬된 배열을 얻을 수도 있습니다.