네, MongoDB에서는 정규식(regexp)을 활용하면 대소문자를 구분하지 않는(case-insensitive) 쿼리를 손쉽게 작성할 수 있습니다. 정규식 패턴 끝에 i 플래그를 붙이면 검색 시 대소문자 차이를 무시하게 됩니다.
기본 문법
db.yourCollectionName.find({"yourFieldName": /^yourvalue$/i});여기서 ^와 $는 각각 문자열의 시작과 끝을 의미하며, 마지막의 i가 대소문자 구분을 해제하는 역할을 합니다.
예제 컬렉션 생성하기
실제 동작을 확인하기 위해 먼저 샘플 문서들을 포함한 컬렉션을 생성해 보겠습니다.
> db.caseInsensitiveDemo.insertOne({"Name":"John"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c6d7a67f2db199c1278e7ef")
}
> db.caseInsensitiveDemo.insertOne({"Name":"JOHN"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c6d7ad6f2db199c1278e7f0")
}위 예제에서는 같은 이름인 "John"과 "JOHN"을 서로 다른 대소문자로 저장했습니다.
저장된 문서 확인하기
find() 메서드를 사용하여 컬렉션의 모든 문서를 조회할 수 있습니다.
> db.caseInsensitiveDemo.find();
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5c6d7a67f2db199c1278e7ef"), "Name" : "John" }
{ "_id" : ObjectId("5c6d7ad6f2db199c1278e7f0"), "Name" : "JOHN" }대소문자 구분 없이 조회하기
이제 i 플래그가 적용된 정규식으로 두 문서를 모두 검색해 보겠습니다.
> db.caseInsensitiveDemo.find({"Name":/^john$/i});검색어를 소문자 "john"으로 입력했음에도 불구하고, 대소문자와 관계없이 일치하는 모든 문서가 반환됩니다.
{ "_id" : ObjectId("5c6d7a67f2db199c1278e7ef"), "Name" : "John" }
{ "_id" : ObjectId("5c6d7ad6f2db199c1278e7f0"), "Name" : "JOHN" }참고: $regex 연산자 활용
정규식 리터럴 대신 $regex 연산자와 $options를 조합해도 동일한 결과를 얻을 수 있습니다.
> db.caseInsensitiveDemo.find({Name: {$regex: "^john$", $options: "i"}});두 방식 모두 성능상 큰 차이는 없지만, 코드 가독성이나 동적 쿼리 구성 상황에 따라 편한 방식을 선택하면 됩니다. 다만 인덱스가 설정된 필드라면 대소문자 무시 검색 시 인덱스 활용이 제한될 수 있으므로, 대량의 데이터를 다룰 때는 Collation(데이터 정렬) 옵션을 미리 설정해 두는 것도 좋은 대안입니다.