MongoDB에서 대소문자를 구분하지 않고(case-insensitive) 문자열을 검색하려면 find() 메서드와 함께 정규식(regex)을 활용하면 됩니다. 이 글에서는 실제 예제를 통해 대소문자 무시 검색 쿼리를 작성하는 방법을 단계별로 살펴보겠습니다.
대소문자를 구분하지 않는 검색의 기본 문법
정규식 옵션 중 하나인 i(ignore case) 플래그를 사용하면 대소문자를 구분하지 않는 검색이 가능합니다. 기본 문법은 다음과 같습니다.
db.demo572.find({"yourFieldName" : { '$regex':/^yourValue$/i}});여기서 /^yourValue$/i의 의미를 살펴보면 다음과 같습니다.
- ^ : 문자열의 시작을 의미합니다.
- $ : 문자열의 끝을 의미합니다.
- i : 대소문자를 구분하지 않도록 하는 옵션입니다.
예제 컬렉션 생성하기
먼저 실습에 사용할 컬렉션에 문서를 삽입해 보겠습니다. 국가 이름이 각각 다른 형태(대문자, 소문자, 혼합)로 저장되어 있습니다.
> db.demo572.insertOne({"CountryName":"US"});{
"acknowledged" : true, "insertedId" : ObjectId("5e915f0e581e9acd78b427f1")
}
> db.demo572.insertOne({"CountryName":"UK"});{
"acknowledged" : true, "insertedId" : ObjectId("5e915f17581e9acd78b427f2")
}
> db.demo572.insertOne({"CountryName":"Us"});{
"acknowledged" : true, "insertedId" : ObjectId("5e915f1b581e9acd78b427f3")
}
> db.demo572.insertOne({"CountryName":"AUS"});{
"acknowledged" : true, "insertedId" : ObjectId("5e915f20581e9acd78b427f4")
}
> db.demo572.insertOne({"CountryName":"us"});{
"acknowledged" : true, "insertedId" : ObjectId("5e915f25581e9acd78b427f5")
}저장된 전체 문서 조회하기
find() 메서드를 사용하여 컬렉션의 모든 문서를 확인할 수 있습니다.
> db.demo572.find();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5e915f0e581e9acd78b427f1"), "CountryName" : "US" }
{ "_id" : ObjectId("5e915f17581e9acd78b427f2"), "CountryName" : "UK" }
{ "_id" : ObjectId("5e915f1b581e9acd78b427f3"), "CountryName" : "Us" }
{ "_id" : ObjectId("5e915f20581e9acd78b427f4"), "CountryName" : "AUS" }
{ "_id" : ObjectId("5e915f25581e9acd78b427f5"), "CountryName" : "us" }현재 컬렉션에는 "US", "UK", "Us", "AUS", "us"처럼 대소문자가 서로 다른 값들이 함께 저장되어 있습니다.
대소문자를 구분하지 않는 검색 쿼리 실행하기
이제 "US"라는 값을 대소문자와 관계없이 검색하는 쿼리를 실행해 보겠습니다.
> db.demo572.find({"CountryName" : { '$regex':/^US$/i}});실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e915f0e581e9acd78b427f1"), "CountryName" : "US" }
{ "_id" : ObjectId("5e915f1b581e9acd78b427f3"), "CountryName" : "Us" }
{ "_id" : ObjectId("5e915f25581e9acd78b427f5"), "CountryName" : "us" }결과 분석
출력 결과를 보면 "US", "Us", "us" 세 개의 문서가 모두 반환된 것을 확인할 수 있습니다. 반면 "UK"나 "AUS"는 값 자체가 일치하지 않기 때문에 검색되지 않았습니다. 이처럼 정규식 끝에 i 옵션만 추가하면 MongoDB에서 손쉽게 대소문자를 구분하지 않는 검색을 구현할 수 있습니다.
참고로, 정확한 일치가 아닌 부분 문자열 검색을 원한다면 ^와 $ 앵커를 제거하고 { '$regex': /yourValue/i } 형태로 작성하면 됩니다.