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

PyMongo에서 MongoDB 정규식($regex) 쿼리 수행하는 방법

PyMongo는 Python 환경에서 MongoDB를 손쉽게 다룰 수 있도록 도와주는 공식 드라이버이자 도구 모음입니다. 이 글에서는 PyMongo의 몽고 셸(mongo shell) 문법을 활용해 정규식(regex) 쿼리를 수행하는 방법을 단계별로 살펴보겠습니다.

정규식 쿼리 기본 문법

MongoDB에서 특정 단어로 시작하는 문서를 찾으려면 $regex 연산자와 정규식 앵커 ^를 함께 사용합니다. 기본 문법은 다음과 같습니다.

db.yourCollectionName.find({'yourFieldName':{'$regex':'^yourWords'}}).pretty();

위 쿼리는 지정한 필드 값이 특정 단어로 시작하는 모든 문서를 반환합니다.

예제 컬렉션 생성하기

실습을 위해 먼저 문서가 포함된 컬렉션을 생성하겠습니다. 아래 쿼리는 performRegex라는 컬렉션에 두 개의 문서를 삽입합니다.

> db.performRegex.insertOne({"ClientName":"Larry","ClientFolderInformation":[
   "Folder 1","Folder 2","Folder 3","Folder 4","Folder 5"], "MainFolderLocation":"/MainFolder/Details/ClientFolder" });
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c8a8b186cea1f28b7aa07f2")
}
> db.performRegex.insertOne({"ClientName":"Larry","ClientFolderInformation":[
   "ClientFolder 1","ClientFolder 2","ClientFolder 3","ClientFolder 4","ClientFolder 5"],
   "MainFolderLocation":"/MainFolder/Details/ClientFolder" });
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c8a8b1d6cea1f28b7aa07f3")
}

삽입이 완료되면 find() 메서드로 컬렉션의 모든 문서를 확인할 수 있습니다.

> db.performRegex.find().pretty();

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

{
   "_id" : ObjectId("5c8a8b186cea1f28b7aa07f2"),
   "ClientName" : "Larry",
   "ClientFolderInformation" : [
      "Folder 1",
      "Folder 2",
      "Folder 3",
      "Folder 4",
      "Folder 5"
   ],
   "MainFolderLocation" : "/MainFolder/Details/ClientFolder"
}
{
   "_id" : ObjectId("5c8a8b1d6cea1f28b7aa07f3"),
   "ClientName" : "Larry",
   "ClientFolderInformation" : [
      "ClientFolder 1",
      "ClientFolder 2",
      "ClientFolder 3",
      "ClientFolder 4",
      "ClientFolder 5"
   ],
   "MainFolderLocation" : "/MainFolder/Details/ClientFolder"
}

정규식 쿼리 실행 예제

Case 1 — 'ClientFolder'로 시작하는 문서 검색

아래 쿼리는 ClientFolderInformation 필드의 배열 요소 중 'ClientFolder'라는 단어로 시작하는 값을 가진 모든 문서를 반환합니다.

> db.performRegex.find({'ClientFolderInformation':{'$regex':'^ClientFolder'}}).pretty();

실행 결과:

{
   "_id" : ObjectId("5c8a8b1d6cea1f28b7aa07f3"),
   "ClientName" : "Larry",
   "ClientFolderInformation" : [
      "ClientFolder 1",
      "ClientFolder 2",
      "ClientFolder 3",
      "ClientFolder 4",
      "ClientFolder 5"
   ],
   "MainFolderLocation" : "/MainFolder/Details/ClientFolder"
}

'ClientFolder'로 시작하는 요소를 포함한 두 번째 문서만 조회된 것을 확인할 수 있습니다.

Case 2 — 'Folder'로 시작하는 문서 검색

이번에는 'Folder'라는 단어로 시작하는 문서를 검색해 보겠습니다.

> db.performRegex.find({'ClientFolderInformation':{'$regex':'^Folder'}}).pretty();

실행 결과:

{
   "_id" : ObjectId("5c8a8b186cea1f28b7aa07f2"),
   "ClientName" : "Larry",
   "ClientFolderInformation" : [
      "Folder 1",
      "Folder 2",
      "Folder 3",
      "Folder 4",
      "Folder 5"
   ],
   "MainFolderLocation" : "/MainFolder/Details/ClientFolder"
}

이번에는 첫 번째 문서만 반환되었습니다. ^ 앵커 덕분에 문자열 중간에 'Folder'가 포함된 'ClientFolder' 항목은 제외되고, 정확히 'Folder'로 시작하는 요소만 매칭됩니다.

마무리 및 참고 사항

이처럼 MongoDB의 $regex 연산자를 사용하면 필드 값이나 배열 요소에 대해 유연한 패턴 매칭 검색을 수행할 수 있습니다. 몇 가지 추가 팁은 다음과 같습니다.

  • 대소문자 구분 없이 검색하려면 {'$regex':'^folder', '$options':'i'}처럼 $optionsi 플래그를 지정하세요.
  • 특정 단어로 끝나는 값을 찾으려면 $ 앵커(예: 'Folder$')를 사용하세요.
  • 인덱스가 설정된 필드에 접두사(^) 정규식을 사용하면 대소문자 구분 검색 시 인덱스를 활용해 성능을 높일 수 있습니다.