MongoDB 정규식($regex)으로 유사한 이름 찾기
MongoDB에서는 $regex 연산자를 사용하면 입력된 이름과 유사한 문서를 손쉽게 검색할 수 있습니다. 특히 $options: 'i' 옵션을 함께 사용하면 대소문자를 구분하지 않고 조회할 수 있어 실무에서 매우 유용합니다.
이번 글에서는 컬렉션을 생성하고, $regex를 이용해 입력값과 비슷한 이름을 찾는 과정을 단계별로 살펴보겠습니다.
1. 샘플 데이터가 담긴 컬렉션 생성하기
먼저 insertOne() 메서드를 사용해 demo514 컬렉션에 여러 개의 문서를 삽입합니다.
> db.demo514.insertOne({"Information":{"FullName":"John Doe"}});
{ "acknowledged" : true, "insertedId" : ObjectId("5e885116987b6e0e9d18f58c") }
> db.demo514.insertOne({"Information":{"FullName":"John Smith"}});
{ "acknowledged" : true, "insertedId" : ObjectId("5e88515e987b6e0e9d18f58d") }
> db.demo514.insertOne({"Information":{"FullName":"john doe"}});
{ "acknowledged" : true, "insertedId" : ObjectId("5e885169987b6e0e9d18f58e") }
> db.demo514.insertOne({"Information":{"FullName":"Chris Brown"}});
{ "acknowledged" : true, "insertedId" : ObjectId("5e88516f987b6e0e9d18f58f") }위 예시에서는 'John Doe', 'John Smith', 'john doe'(소문자), 'Chris Brown' 총 4개의 이름이 저장되었습니다.
2. find()로 전체 문서 확인하기
컬렉션에 저장된 모든 문서를 확인하려면 find() 메서드를 사용합니다.
> db.demo514.find();
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e885116987b6e0e9d18f58c"), "Information" : { "FullName" : "John Doe" } }
{ "_id" : ObjectId("5e88515e987b6e0e9d18f58d"), "Information" : { "FullName" : "John Smith" } }
{ "_id" : ObjectId("5e885169987b6e0e9d18f58e"), "Information" : { "FullName" : "john doe" } }
{ "_id" : ObjectId("5e88516f987b6e0e9d18f58f"), "Information" : { "FullName" : "Chris Brown" } }3. $regex를 사용한 유사 이름 검색 쿼리
이제 입력값과 유사한 이름을 찾는 쿼리를 작성해 보겠습니다. 중첩 필드인 Information.FullName에 대해 $regex 조건을 적용하고, $options: 'i'로 대소문자 무시 옵션을 설정합니다.
> db.demo514.find({'Information.FullName': {$regex: "John Doe", $options: 'i'}});쿼리 실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e885116987b6e0e9d18f58c"), "Information" : { "FullName" : "John Doe" } }
{ "_id" : ObjectId("5e885169987b6e0e9d18f58e"), "Information" : { "FullName" : "john doe" } }결과 분석 및 핵심 포인트
검색 결과를 보면 'John Doe'와 'john doe' 두 문서가 모두 반환되었습니다. 이는 $options의 'i'(case-insensitive) 옵션이 대소문자 차이를 무시하고 매칭했기 때문입니다.
- $regex: 문자열 패턴 매칭을 위한 MongoDB 연산자로, 부분 일치 검색이 가능합니다.
- $options: 'i': 대소문자를 구분하지 않고 검색합니다.
- 중첩 필드 접근: 도트 표기법(Information.FullName)으로 내부 필드에 접근할 수 있습니다.
참고로 $regex 검색은 인덱스를 제대로 활용하지 못할 수 있으므로, 대량의 데이터를 다루는 경우에는 성능에 유의해야 합니다. 필요하다면 텍스트 인덱스나 Atlas Search 같은 대안도 고려해 보시기 바랍니다.