MongoDB에서 두 필드의 문자열을 하나로 합치기
MongoDB에서 두 개의 필드에 저장된 문자열 값을 이어 붙여 새로운 필드를 만들고 싶다면 aggregate() 메서드와 $concat 연산자를 함께 사용하면 됩니다. 예를 들어 이름(first name)과 성(last name)이 각각 다른 필드로 나뉘어 있을 때, 이를 하나의 전체 이름(full name) 필드로 합칠 수 있습니다.
기본 문법
두 필드의 문자열을 세 번째 필드로 연결하는 기본적인 쿼리 형식은 다음과 같습니다.
db.yourCollectionName.aggregate(
[
{ $project: { "yourNewFieldName": { $concat: [ "$yourFieldName1", " yourDelimiterValue ", "$yourFieldName2" ] } } }
]
);예제: 컬렉션 생성 및 데이터 삽입
먼저 실습에 사용할 컬렉션을 만들고 문서를 삽입해 보겠습니다.
> db.concatenateStringsDemo.insertOne({"StudentFirstName":"John","StudentLastName":"Doe"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9bb7362d66697741252444")
}
> db.concatenateStringsDemo.insertOne({"StudentFirstName":"John","StudentLastName":"Smith"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9bb7402d66697741252445")
}
> db.concatenateStringsDemo.insertOne({"StudentFirstName":"Carol","StudentLastName":"Taylor"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9bb74c2d66697741252446")
}
> db.concatenateStringsDemo.insertOne({"StudentFirstName":"David","StudentLastName":"Miller"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9bb7752d66697741252447")
}
> db.concatenateStringsDemo.insertOne({"StudentFirstName":"James","StudentLastName":"Williams"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9bb7862d66697741252448")
}삽입된 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.
> db.concatenateStringsDemo.find().pretty();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : ObjectId("5c9bb7362d66697741252444"),
"StudentFirstName" : "John",
"StudentLastName" : "Doe"
}
{
"_id" : ObjectId("5c9bb7402d66697741252445"),
"StudentFirstName" : "John",
"StudentLastName" : "Smith"
}
{
"_id" : ObjectId("5c9bb74c2d66697741252446"),
"StudentFirstName" : "Carol",
"StudentLastName" : "Taylor"
}
{
"_id" : ObjectId("5c9bb7752d66697741252447"),
"StudentFirstName" : "David",
"StudentLastName" : "Miller"
}
{
"_id" : ObjectId("5c9bb7862d66697741252448"),
"StudentFirstName" : "James",
"StudentLastName" : "Williams"
}두 필드를 연결해 새 필드 생성하기
이제 본격적으로 "StudentFirstName" 필드와 "StudentLastName" 필드를 연결하여 세 번째 필드인 "StudentFullName"을 만들어 보겠습니다. 여기서는 구분자(delimiter)로 " / "를 사용했습니다.
> db.concatenateStringsDemo.aggregate(
... [
... { $project: { "StudentFullName": { $concat: [ "$StudentFirstName", " / ", "$StudentLastName" ] } } }
... ]
... );쿼리를 실행하면 다음과 같이 두 필드가 연결된 결과를 확인할 수 있습니다.
{ "_id" : ObjectId("5c9bb7362d66697741252444"), "StudentFullName" : "John / Doe" }
{ "_id" : ObjectId("5c9bb7402d66697741252445"), "StudentFullName" : "John / Smith" }
{ "_id" : ObjectId("5c9bb74c2d66697741252446"), "StudentFullName" : "Carol / Taylor" }
{ "_id" : ObjectId("5c9bb7752d66697741252447"), "StudentFullName" : "David / Miller" }
{ "_id" : ObjectId("5c9bb7862d66697741252448"), "StudentFullName" : "James / Williams" }참고 사항
$concat 연산자를 사용할 때 몇 가지 유의할 점이 있습니다.
1. null 또는 누락된 필드 처리: $concat에 포함된 인수 중 하나라도 null이거나 해당 필드가 문서에 존재하지 않으면, 결과는 null이 반환됩니다. 따라서 값이 없을 수 있는 필드를 연결할 때는 $ifNull 연산자를 함께 사용하는 것이 안전합니다.
2. 원본 필드 유지: 위 예제처럼 $project에서 새 필드만 지정하면 출력 결과에는 _id와 새 필드만 포함됩니다. 기존 필드도 함께 유지하고 싶다면 $project 단계에 해당 필드들을 명시적으로 추가해야 합니다.
3. 구분자 자유롭게 지정: 구분자는 공백, 하이픈(-), 슬래시(/) 등 원하는 문자열로 자유롭게 지정할 수 있으며, 구분자 없이 바로 연결하는 것도 가능합니다.