MongoDB에서 문자열 필드의 일부분, 즉 부분 문자열(substring)을 추출하려면 집계(aggregation) 파이프라인에서 $substr 연산자를 사용하면 됩니다. 이 글에서는 실제 예제를 통해 $substr의 사용 방법을 단계별로 살펴보겠습니다.
1. 컬렉션 생성 및 문서 삽입
먼저 insertOne() 메서드를 사용해 demo176 컬렉션에 문서를 생성합니다.
> db.demo176.insertOne({"ProductName":"PRODUCT-1"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3843a09e4f06af551997ef")
}
> db.demo176.insertOne({"ProductName":"PRODUCT-102"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3843a69e4f06af551997f0")
}
> db.demo176.insertOne({"ProductName":"PRODUCT-105"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3843aa9e4f06af551997f1")
}2. 삽입된 문서 조회하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.demo176.find();
위 쿼리는 다음과 같은 결과를 출력합니다.
{ "_id" : ObjectId("5e3843a09e4f06af551997ef"), "ProductName" : "PRODUCT-1" }
{ "_id" : ObjectId("5e3843a69e4f06af551997f0"), "ProductName" : "PRODUCT-102" }
{ "_id" : ObjectId("5e3843aa9e4f06af551997f1"), "ProductName" : "PRODUCT-105" }3. $substr로 부분 문자열 추출하기
다음은 MongoDB 집계에서 부분 문자열을 가져오는 쿼리입니다. $project 단계 안에서 $substr 연산자를 사용하며, 배열 형태로 [필드명, 시작 인덱스, 길이]를 지정합니다. 여기서는 0번째 문자부터 7글자를 추출하도록 설정했습니다.
> db.demo176.aggregate(
... [
... {
... $project:
... {
...
... ProductName: { $substr: [ "$ProductName", 0, 7] }
...
... }
... }
... ]
...)실행 결과는 다음과 같습니다. 세 문서 모두 앞 7글자인 "PRODUCT"만 남은 것을 확인할 수 있습니다.
{ "_id" : ObjectId("5e3843a09e4f06af551997ef"), "ProductName" : "PRODUCT" }
{ "_id" : ObjectId("5e3843a69e4f06af551997f0"), "ProductName" : "PRODUCT" }
{ "_id" : ObjectId("5e3843aa9e4f06af551997f1"), "ProductName" : "PRODUCT" }참고: $substrBytes와 $substrCP
$substr은 MongoDB 3.4부터 더 이상 권장되지 않으며(deprecated), 대신 $substrBytes 또는 $substrCP 사용이 권장됩니다. 특히 한글처럼 여러 바이트로 표현되는 문자를 다룰 때는 코드 포인트(code point) 기준으로 동작하는 $substrCP를 사용하는 것이 안전합니다.