MongoDB에서 결과 연결이란?
MongoDB에서 조회한 여러 필드의 값을 하나의 문자열로 합쳐야 할 때가 있습니다. 이럴 때 forEach() 메서드를 사용하면 커서(cursor)로 반환된 각 문서를 순회하면서 원하는 형태로 결과를 연결(concatenate)할 수 있습니다.
이 글에서는 실제 예제를 통해 컬렉션 생성부터 결과 연결까지 전 과정을 단계별로 살펴보겠습니다.
1단계: 샘플 컬렉션 생성
먼저 insertOne() 메서드를 사용해 문서가 포함된 컬렉션을 생성합니다.
> db.concatenateDemo.insertOne({"Name":"John","Age":21});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cc80dd88f9e6ff3eb0ce448")
}
> db.concatenateDemo.insertOne({"Name":"Carol","Age":23});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cc80de18f9e6ff3eb0ce449")
}위 명령은 'concatenateDemo'라는 컬렉션에 이름(Name)과 나이(Age) 필드를 가진 두 개의 문서를 삽입합니다.
2단계: find()로 전체 문서 조회
find() 메서드와 pretty()를 함께 사용하면 컬렉션의 모든 문서를 보기 좋게 출력할 수 있습니다.
> db.concatenateDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5cc80dd88f9e6ff3eb0ce448"),
"Name" : "John",
"Age" : 21
}
{
"_id" : ObjectId("5cc80de18f9e6ff3eb0ce449"),
"Name" : "Carol",
"Age" : 23
}3단계: forEach()로 결과 연결하기
이제 forEach() 메서드에 콜백 함수를 전달하여 각 문서의 Name과 Age 값을 하나의 새로운 필드로 합쳐 보겠습니다.
> db.concatenateDemo.find().forEach( function (result) {result.NameAndAge = result.Name + ' ' + result.Age; printjson(result); } );실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5cc80dd88f9e6ff3eb0ce448"),
"Name" : "John",
"Age" : 21,
"NameAndAge" : "John 21"
}
{
"_id" : ObjectId("5cc80de18f9e6ff3eb0ce449"),
"Name" : "Carol",
"Age" : 23,
"NameAndAge" : "Carol 23"
}출력 결과를 보면 각 문서에 NameAndAge라는 새로운 필드가 추가되고, 이름과 나이가 공백으로 구분된 하나의 문자열로 연결된 것을 확인할 수 있습니다.
참고: $concat 집계 연산자 활용
forEach()는 클라이언트 측에서 결과를 가공하는 방식입니다. 반면 서버 측에서 데이터 자체를 변환하고 싶다면 집계 파이프라인(aggregation pipeline)의 $concat 연산자를 사용하는 것이 더 효율적일 수 있습니다.
> db.concatenateDemo.aggregate([
... { $project: {
... NameAndAge: { $concat: ["$Name", " ", { $toString: "$Age" }] }
... }}
... ]);단, $concat은 문자열 타입만 지원하므로 숫자 필드인 Age는 $toString으로 먼저 변환해 주어야 한다는 점에 유의하세요.
정리
MongoDB에서 쿼리 결과를 연결하는 가장 간단한 방법은 find()와 forEach()를 조합하는 것입니다. 클라이언트에서 유연하게 결과를 가공할 수 있으며, 필요에 따라 $concat 집계 연산자를 사용해 서버 측에서 처리하는 방법도 고려해 볼 수 있습니다.