MongoDB에서 대소문자를 구분하지 않고 데이터를 조회하려면 정규 표현식(regular expression)을 활용하면 됩니다. 개념을 쉽게 이해하기 위해 먼저 컬렉션을 생성하고 문서를 삽입한 뒤, 실제 쿼리 결과를 확인해 보겠습니다.
1. 컬렉션 생성 및 문서 삽입
먼저 caseInsensitiveDemo라는 컬렉션에 다양한 대소문자 조합의 이름을 가진 문서들을 삽입합니다.
> db.caseInsensitiveDemo.insertOne({"UserName":"David"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c7f6fec8d10a061296a3c45")
}
> db.caseInsensitiveDemo.insertOne({"UserName":"DAVID"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c7f6ff28d10a061296a3c46")
}
> db.caseInsensitiveDemo.insertOne({"UserName":"david"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c7f6ffa8d10a061296a3c47")
}
> db.caseInsensitiveDemo.insertOne({"UserName":"Carol"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c7f70008d10a061296a3c48")
}
> db.caseInsensitiveDemo.insertOne({"UserName":"Mike"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c7f70058d10a061296a3c49")
}
> db.caseInsensitiveDemo.insertOne({"UserName":"Sam"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c7f70098d10a061296a3c4a")
}
> db.caseInsensitiveDemo.insertOne({"UserName":"daVID"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c7f70138d10a061296a3c4b")
}2. 전체 문서 조회하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.caseInsensitiveDemo.find().pretty();
위 쿼리를 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.
{ "_id" : ObjectId("5c6d7a67f2db199c1278e7ef"), "Name" : "John" }
{ "_id" : ObjectId("5c6d7ad6f2db199c1278e7f0"), "Name" : "JOHN" }
{ "_id" : ObjectId("5c7f6fec8d10a061296a3c45"), "UserName" : "David" }
{ "_id" : ObjectId("5c7f6ff28d10a061296a3c46"), "UserName" : "DAVID" }
{ "_id" : ObjectId("5c7f6ffa8d10a061296a3c47"), "UserName" : "david" }
{ "_id" : ObjectId("5c7f70008d10a061296a3c48"), "UserName" : "Carol" }
{ "_id" : ObjectId("5c7f70058d10a061296a3c49"), "UserName" : "Mike" }
{ "_id" : ObjectId("5c7f70098d10a061296a3c4a"), "UserName" : "Sam" }
{ "_id" : ObjectId("5c7f70138d10a061296a3c4b"), "UserName" : "daVID" }3. 대소문자를 구분하지 않는 쿼리 실행하기
이제 정규 표현식에 i(ignore case) 옵션 플래그를 붙여 대소문자와 관계없이 'david'라는 이름을 가진 모든 문서를 조회해 보겠습니다.
> db.caseInsensitiveDemo.find({UserName: /^david$/i } ).pretty();실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5c7f6fec8d10a061296a3c45"), "UserName" : "David" }
{ "_id" : ObjectId("5c7f6ff28d10a061296a3c46"), "UserName" : "DAVID" }
{ "_id" : ObjectId("5c7f6ffa8d10a061296a3c47"), "UserName" : "david" }
{ "_id" : ObjectId("5c7f70138d10a061296a3c4b"), "UserName" : "daVID" }정리
정규 표현식 패턴 끝에 /i 플래그를 추가하면 대소문자를 구분하지 않는 검색이 가능합니다. 위 예제에서 볼 수 있듯이 'David', 'DAVID', 'david', 'daVID'처럼 대소문자가 서로 다른 모든 문서가 한 번에 조회되는 것을 확인할 수 있습니다. 참고로 ^와 $는 각각 문자열의 시작과 끝을 의미하므로, 정확히 일치하는 값만 찾고 싶다면 이 두 기호를 함께 사용하는 것이 좋습니다.