Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB $regex 연산자로 대소문자 구분 없이 검색하는 방법 (i 옵션 활용)

MongoDB에서 대소문자를 구분하지 않는 검색이 필요한 이유

MongoDB에서 문자열을 검색할 때 기본적으로는 대소문자가 구분됩니다. 예를 들어 "mongodb"로 검색하면 "MongoDB"나 "MONGODB" 같은 문서는 조회되지 않습니다. 이런 경우 $regex 연산자대소문자 무시 옵션(i)을 함께 사용하면 해결할 수 있습니다.

먼저 문서가 포함된 컬렉션을 생성해 보겠습니다.

> db.demo759.insertOne({SubjectName:"MySQL"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5eb02ba95637cd592b2a4ae7")
}
> db.demo759.insertOne({SubjectName:"MongoDB"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5eb02baa5637cd592b2a4ae8")
}
> db.demo759.insertOne({SubjectName:"mongodb"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5eb02baf5637cd592b2a4ae9")
}
> db.demo759.insertOne({SubjectName:"MONGODB"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5eb02bb85637cd592b2a4aea")
}

위 예제에서는 demo759 컬렉션에 대소문자 표기가 서로 다른 네 개의 문서(MySQL, MongoDB, mongodb, MONGODB)를 삽입했습니다.

컬렉션의 모든 문서 확인하기

find() 메서드를 사용하여 컬렉션의 모든 문서를 조회합니다.

> db.demo759.find();

실행하면 다음과 같은 출력 결과를 확인할 수 있습니다.

{ "_id" : ObjectId("5eb02ba95637cd592b2a4ae7"), "SubjectName" : "MySQL" }
{ "_id" : ObjectId("5eb02baa5637cd592b2a4ae8"), "SubjectName" : "MongoDB" }
{ "_id" : ObjectId("5eb02baf5637cd592b2a4ae9"), "SubjectName" : "mongodb" }
{ "_id" : ObjectId("5eb02bb85637cd592b2a4aea"), "SubjectName" : "MONGODB" }

$regex 연산자와 i 옵션으로 대소문자 무시 검색하기

다음은 MongoDB의 regex 연산자를 적용한 쿼리입니다. 정규식 패턴 뒤에 붙인 i 플래그가 대소문자 구분을 비활성화하는 역할을 합니다.

> db.demo759.find({"SubjectName":{$regex:/mongodb/i}});

실행 결과는 다음과 같습니다.

{ "_id" : ObjectId("5eb02baa5637cd592b2a4ae8"), "SubjectName" : "MongoDB" }
{ "_id" : ObjectId("5eb02baf5637cd592b2a4ae9"), "SubjectName" : "mongodb" }
{ "_id" : ObjectId("5eb02bb85637cd592b2a4aea"), "SubjectName" : "MONGODB" }

결과 분석

출력 결과를 보면 "mongodb", "MongoDB", "MONGODB" 세 개의 문서가 모두 조회되었습니다. 즉, i 옵션(case insensitive) 덕분에 검색어와 저장된 값의 대소문자가 달라도 정상적으로 매칭되는 것을 확인할 수 있습니다. 반면 "MySQL" 문서는 검색 조건에 해당하지 않으므로 결과에 포함되지 않았습니다.

참고로 $regex 연산자는 { field: { $regex: /pattern/i } } 형태뿐 아니라 { field: { $regex: 'pattern', $options: 'i' } }처럼 $options 필드로 옵션을 지정하는 방식도 지원하므로, 상황에 맞게 선택하여 사용하면 됩니다.