MongoDB에서 두 개 이상의 문자열 필드를 하나로 합치고 싶다면 $concat 연산자를 사용하면 됩니다. $concat은 집계(aggregate) 파이프라인 내에서 동작하며, 여러 문자열 값을 지정한 구분자와 함께 연결해 새로운 필드로 생성해 줍니다.
이 글에서는 실제 예제를 통해 학생의 이름(StudentFirstName)과 성(StudentLastName)을 하나의 전체 이름(StudentFullName) 필드로 연결하는 과정을 단계별로 살펴보겠습니다.
1. 샘플 컬렉션 생성하기
먼저 insertOne() 메서드를 사용해 테스트용 문서가 담긴 컬렉션을 생성합니다.
>db.concatenateFieldsDemo.insertOne({"StudentFirstName":"Adam","StudentLastName":"Smith"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd6ebf46d78f205348bc62e")
}
>db.concatenateFieldsDemo.insertOne({"StudentFirstName":"John","StudentLastName":"Doe"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd6ebfc6d78f205348bc62f")
}
>db.concatenateFieldsDemo.insertOne({"StudentFirstName":"David","StudentLastName":"Miller"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd6ec376d78f205348bc630")
}
>db.concatenateFieldsDemo.insertOne({"StudentFirstName":"Sam","StudentLastName":"Williams"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd6ec436d78f205348bc631")
}2. 저장된 문서 확인하기
find() 메서드에 pretty()를 함께 사용하면 컬렉션에 저장된 모든 문서를 보기 좋게 출력할 수 있습니다.
> db.concatenateFieldsDemo.find().pretty();
위 명령을 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : ObjectId("5cd6ebf46d78f205348bc62e"),
"StudentFirstName" : "Adam",
"StudentLastName" : "Smith"
}
{
"_id" : ObjectId("5cd6ebfc6d78f205348bc62f"),
"StudentFirstName" : "John",
"StudentLastName" : "Doe"
}
{
"_id" : ObjectId("5cd6ec376d78f205348bc630"),
"StudentFirstName" : "David",
"StudentLastName" : "Miller"
}
{
"_id" : ObjectId("5cd6ec436d78f205348bc631"),
"StudentFirstName" : "Sam",
"StudentLastName" : "Williams"
}3. $concat으로 필드 연결하기
aggregate()와 $project 단계를 조합하면 기존 필드는 그대로 유지하면서 연결된 새로운 필드를 추가할 수 있습니다. 아래 쿼리는 StudentFirstName과 StudentLastName을 슬래시(/) 구분자로 연결해 StudentFullName이라는 새 필드를 만듭니다.
> db.concatenateFieldsDemo.aggregate([
{$project:{"StudentFullName":{$concat:
["$StudentFirstName","/","$StudentLastName"]},"StudentFirstName":1,"StudentLastName":1}}
]);실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5cd6ebf46d78f205348bc62e"), "StudentFirstName" : "Adam", "StudentLastName" : "Smith", "StudentFullName" : "Adam/Smith" }
{ "_id" : ObjectId("5cd6ebfc6d78f205348bc62f"), "StudentFirstName" : "John", "StudentLastName" : "Doe", "StudentFullName" : "John/Doe" }
{ "_id" : ObjectId("5cd6ec376d78f205348bc630"), "StudentFirstName" : "David", "StudentLastName" : "Miller", "StudentFullName" : "David/Miller" }
{ "_id" : ObjectId("5cd6ec436d78f205348bc631"), "StudentFirstName" : "Sam", "StudentLastName" : "Williams", "StudentFullName" : "Sam/Williams" }참고 사항
$concat 사용 시 한 가지 주의할 점이 있습니다. 연결 대상 중 하나라도 null이거나 해당 필드가 문서에 존재하지 않으면 전체 결과가 null로 반환됩니다. 따라서 필드가 누락될 가능성이 있는 경우에는 $ifNull 연산자를 함께 사용해 기본값을 지정해 주는 것이 안전합니다.