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

MongoDB에서 대소문자를 구분하지 않는 쿼리 수행하는 방법

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'처럼 대소문자가 서로 다른 모든 문서가 한 번에 조회되는 것을 확인할 수 있습니다. 참고로 ^$는 각각 문자열의 시작과 끝을 의미하므로, 정확히 일치하는 값만 찾고 싶다면 이 두 기호를 함께 사용하는 것이 좋습니다.