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