MongoDB에는 문자열 길이를 직접 비교하는 전용 연산자가 없습니다. 대신 $regex 연산자와 정규식의 반복 범위 지정자를 활용하면 특정 길이 조건에 맞는 문서를 손쉽게 조회할 수 있습니다.
기본 문법
길이 조건으로 쿼리할 때 사용하는 기본 문법은 다음과 같습니다.
db.yourCollectionName.find({ 'yourFieldName': { $regex: /^.{yourLengthValue1,yourLengthValue2}$/ } });정규식 패턴의 각 구성 요소는 아래와 같은 의미를 가집니다.
^: 문자열의 시작을 의미합니다.$: 문자열의 끝을 의미합니다..{최소길이,최대길이}: 임의의 문자(.)가 지정한 횟수만큼 반복되어야 함을 의미합니다.
예제 컬렉션 생성
실습을 위해 먼저 컬렉션을 만들고 문서를 삽입해 보겠습니다. 다음은 문서를 추가하는 쿼리입니다.
> db.queryLengthDemo.insertOne({"StudentFullName":"John Smith"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9a01ae353decbc2fc927c0")
}
> db.queryLengthDemo.insertOne({"StudentFullName":"John Doe"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9a01b4353decbc2fc927c1")
}
> db.queryLengthDemo.insertOne({"StudentFullName":"David Miller"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9a01c2353decbc2fc927c2")
}
> db.queryLengthDemo.insertOne({"StudentFullName":"Robert Taylor"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9a01e2353decbc2fc927c3")
}
> db.queryLengthDemo.insertOne({"StudentFullName":"Chris Williams"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9a01f1353decbc2fc927c4")
}저장된 전체 문서 확인
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.queryLengthDemo.find().pretty();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : ObjectId("5c9a01ae353decbc2fc927c0"),
"StudentFullName" : "John Smith"
}
{
"_id" : ObjectId("5c9a01b4353decbc2fc927c1"),
"StudentFullName" : "John Doe"
}
{
"_id" : ObjectId("5c9a01c2353decbc2fc927c2"),
"StudentFullName" : "David Miller"
}
{
"_id" : ObjectId("5c9a01e2353decbc2fc927c3"),
"StudentFullName" : "Robert Taylor"
}
{
"_id" : ObjectId("5c9a01f1353decbc2fc927c4"),
"StudentFullName" : "Chris Williams"
}길이 조건으로 문서 조회하기
이제 학생 이름(StudentFullName)의 길이가 9자 이상 12자 이하인 문서만 조회해 보겠습니다.
> db.queryLengthDemo.find({ StudentFullName: { $regex: /^.{9,12}$/ } }).pretty();실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c9a01ae353decbc2fc927c0"),
"StudentFullName" : "John Smith"
}
{
"_id" : ObjectId("5c9a01c2353decbc2fc927c2"),
"StudentFullName" : "David Miller"
}결과를 보면 "John Smith"(공백 포함 10자)와 "David Miller"(공백 포함 12자) 두 문서만 반환된 것을 확인할 수 있습니다. 나머지 문서들은 이름 길이가 조건 범위를 벗어나기 때문에 제외되었습니다.
참고 사항
- 정확히 하나의 길이만 매칭하고 싶다면
/^.{10}$/처럼 단일 숫자를 지정하면 됩니다. - 컬렉션 규모가 클 경우 정규식 쿼리는 전체 문서 스캔으로 이어질 수 있으므로, 가능하면 앞부분이 고정된 접두사 패턴과 함께 사용하거나 애플리케이션 단에서 길이를 검증하는 방안도 고려하는 것이 좋습니다.