MongoDB에서 쿼리 결과로 반환되는 문자열 필드의 길이를 제한하고 싶다면 집계 파이프라인의 $substr 연산자를 사용하면 됩니다. 이 글에서는 실제 예제를 통해 특정 필드에서 원하는 길이만큼의 문자만 잘라서 반환하는 방법을 단계별로 살펴보겠습니다.
1. 샘플 컬렉션 생성
먼저 문서를 포함하는 컬렉션을 생성합니다.
> db.limitTheNumberOfCharactersDemo.insertOne({"Title":"MongoDB is No SQL database"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cf23013b64a577be5a2bc0e")
}
> db.limitTheNumberOfCharactersDemo.insertOne({"Title":"MySQL is a relational database"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cf2302db64a577be5a2bc0f")
}위 코드는 두 개의 문서를 가진 limitTheNumberOfCharactersDemo 컬렉션을 만들며, 각 문서에는 데이터베이스 관련 설명이 담긴 Title 필드가 들어 있습니다.
2. 저장된 문서 확인하기
find() 메서드를 사용해 컬렉션의 모든 문서를 조회해 보겠습니다.
> db.limitTheNumberOfCharactersDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5cf23013b64a577be5a2bc0e"),
"Title" : "MongoDB is No SQL database"
}
{
"_id" : ObjectId("5cf2302db64a577be5a2bc0f"),
"Title" : "MySQL is a relational database"
}현재 각 문서의 Title 필드는 전체 문자열을 그대로 담고 있습니다. 이제 여기서 일부 문자만 잘라내어 반환해 보겠습니다.
3. $substr로 반환 문자 수 제한하기
문자 수를 제한하려면 aggregate() 메서드와 함께 $project 단계 안에서 $substr 연산자를 사용합니다. 아래 쿼리는 Title 필드의 첫 번째 문자부터 20개의 문자까지만 추출하여 새로운 필드 Characters에 담습니다.
> db.limitTheNumberOfCharactersDemo.aggregate(
[
{
$project:
{
Characters: { $substr: [ "$Title", 0, 20 ] }
}
}
]
);$substr 배열의 인수는 순서대로 [대상 필드, 시작 위치, 추출할 문자 수]를 의미합니다. 즉, 위 예제는 인덱스 0(문자열 맨 앞)부터 20자를 가져오도록 설정한 것입니다.
실행 결과
{ "_id" : ObjectId("5cf23013b64a577be5a2bc0e"), "Characters" : "MongoDB is No SQL da" }
{ "_id" : ObjectId("5cf2302db64a577be5a2bc0f"), "Characters" : "MySQL is a relationa" }결과를 보면 두 문서 모두 Title 필드의 내용이 정확히 20자로 잘려서 Characters 필드에 반환된 것을 확인할 수 있습니다. 원본 문서는 변경되지 않으며, 조회 결과에만 적용됩니다.
참고: 최신 버전에서는 $substrCP 권장
$substr은 바이트 기준으로 동작하기 때문에 한글처럼 멀티바이트 문자를 다룰 때 문자가 깨질 수 있습니다. MongoDB 3.4 이상 버전에서는 유니코드 코드포인트 기준으로 동작하는 $substrCP(또는 $substrBytes)를 사용하는 것이 좋습니다. 사용 방법은 동일하게 세 개의 인수를 전달합니다.
{ $substrCP: [ "$Title", 0, 20 ] }정리
MongoDB에서 쿼리 결과의 특정 필드 문자 수를 제한하려면 aggregate()의 $project 단계에서 $substr 연산자를 활용하면 됩니다. 목록 미리보기, 요약 텍스트 표시 등 프런트엔드에서 문자열을 자르기 전에 서버 쪽에서 처리해야 할 때 매우 유용한 기능입니다.