MongoDB에서 배열에 저장된 문자열 값들을 대상으로 정규식(regexp) 일치 검색을 수행해야 하는 경우가 자주 있습니다. 예를 들어, 학생 이름 목록이 배열 형태로 저장되어 있고 특정 문자로 시작하는 이름이 포함된 문서만 조회하고 싶다면 정규식 패턴을 활용하면 됩니다.
기본 문법
배열 필드를 정규식으로 쿼리할 때는 다음과 같은 문법을 사용합니다.
db.yourCollectionName.find( { yourFieldName: /yourStartingValue./ } ).pretty();배열 필드에 정규식 조건을 직접 지정하면, MongoDB는 배열 내 어느 하나의 요소라도 해당 패턴과 일치하는 문서를 모두 반환합니다.
예제 컬렉션 생성
먼저 실습용 컬렉션을 만들고 문서를 삽입해 보겠습니다. 각 문서는 학생 전체 이름을 담은 배열 필드(StudentFullName)를 가지고 있습니다.
> db.queryArrayDemo.insertOne({"StudentFullName":["Carol Taylor","Caroline Williams","Claire Brown"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ca2774c6304881c5ce84ba0")
}
> db.queryArrayDemo.insertOne({"StudentFullName":["John Smith","Jace Doe","Jabin Brown"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ca277b36304881c5ce84ba1")
}저장된 문서 확인하기
find() 메서드를 사용해 컬렉션의 모든 문서를 조회해 보겠습니다.
> db.queryArrayDemo.find().pretty();
위 쿼리는 다음과 같은 결과를 출력합니다.
{
"_id" : ObjectId("5ca2774c6304881c5ce84ba0"),
"StudentFullName" : [
"Carol Taylor",
"Caroline Williams",
"Claire Brown"
]
}
{
"_id" : ObjectId("5ca277b36304881c5ce84ba1"),
"StudentFullName" : [
"John Smith",
"Jace Doe",
"Jabin Brown"
]
}정규식으로 배열 문자열 쿼리하기
이제 실제로 정규식 패턴을 사용해 배열 내 문자열을 검색해 보겠습니다. 아래 예제는 J로 시작하는 이름이 배열에 포함된 문서를 찾는 쿼리입니다.
> db.queryArrayDemo.find( { StudentFullName : /J./ } ).pretty();실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5ca277b36304881c5ce84ba1"),
"StudentFullName" : [
"John Smith",
"Jace Doe",
"Jabin Brown"
]
}결과 분석
첫 번째 문서의 이름들(Carol Taylor, Caroline Williams, Claire Brown)은 모두 'C'로 시작하기 때문에 조회되지 않았습니다. 반면 두 번째 문서는 John Smith, Jace Doe, Jabin Brown처럼 'J'로 시작하는 요소가 배열 안에 존재하므로 정규식 /J./ 패턴과 일치하여 결과에 포함된 것입니다.
참고 사항
- 정규식 매칭은 기본적으로 대소문자를 구분합니다. 대소문자를 구분하지 않으려면
/pattern/i처럼i옵션을 추가하세요. - 문자열 시작 위치를 명확히 지정하려면 앵커(^)를 사용하는 것이 좋습니다. 예:
/^J/ - 배열 내 단일 요소가 아니라 배열 전체가 정확히 일치해야 하는 경우에는
$elemMatch나 다른 연산자를 고려할 수 있습니다.
이처럼 MongoDB에서는 별도의 특수 연산자 없이 정규식 리터럴만으로 배열 필드의 문자열 요소를 손쉽게 검색할 수 있습니다.