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

MongoDB에서 $regex 연산자로 정규식 검색하는 방법

MongoDB에서 $regex 연산자는 쿼리에 정규 표현식(regular expression)을 적용하여 특정 문자열 패턴과 일치하는 문서를 검색할 때 사용합니다. 대소문자 구분 여부를 조절하는 옵션 등과 함께 활용하면 훨씬 유연한 데이터 조회가 가능합니다.

$regex 기본 문법

MongoDB에서 $regex를 사용하는 기본 문법은 다음과 같습니다.

db.yourCollectionName.find({yourFieldName: { $regex: yourValue}});

예제용 컬렉션 생성하기

먼저 문서가 담긴 컬렉션을 생성해 보겠습니다. 의도적으로 대소문자가 다른 값들을 넣어 차이를 확인하기 쉽게 구성했습니다.

> db.regularExpressionDemo.insertOne({"UserName":"John"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cdffc25bf3115999ed51210")
}
> db.regularExpressionDemo.insertOne({"UserName":"JOHN"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cdffc2ebf3115999ed51211")
}
> db.regularExpressionDemo.insertOne({"UserName":"john"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cdffc35bf3115999ed51212")
}
> db.regularExpressionDemo.insertOne({"UserName":"JoHn"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cdffc3ebf3115999ed51213")
}

find() 메서드로 전체 문서 조회하기

find() 메서드를 사용하면 컬렉션의 모든 문서를 확인할 수 있습니다.

> db.regularExpressionDemo.find();

위 쿼리는 다음과 같은 결과를 출력합니다.

{ "_id" : ObjectId("5cdffc25bf3115999ed51210"), "UserName" : "John" }
{ "_id" : ObjectId("5cdffc2ebf3115999ed51211"), "UserName" : "JOHN" }
{ "_id" : ObjectId("5cdffc35bf3115999ed51212"), "UserName" : "john" }
{ "_id" : ObjectId("5cdffc3ebf3115999ed51213"), "UserName" : "JoHn" }

$regex로 대소문자를 구분하여 검색하기

이제 $regex를 사용한 실제 검색 쿼리를 살펴보겠습니다. 아래 쿼리는 'JOHN'과 정확히 일치하는(대소문자를 구분하는) 문서만 반환합니다.

> db.regularExpressionDemo.find({'UserName': { $regex: 'JOHN'}});

실행 결과는 다음과 같습니다. 'JOHN'과 철자와 대소문자가 모두 일치하는 문서 하나만 조회된 것을 확인할 수 있습니다.

{ "_id" : ObjectId("5cdffc2ebf3115999ed51211"), "UserName" : "JOHN" }

$options 'i'로 대소문자 구분 없이 검색하기

대소문자와 관계없이 모든 경우를 매칭하고 싶다면 $options: 'i'(case-insensitivity) 옵션을 추가하면 됩니다. 이 옵션은 정규식 매칭 시 대소문자를 무시하도록 지정합니다.

> db.regularExpressionDemo.find({'UserName': { $regex: 'JOHN', $options: 'i' }});

실행 결과는 다음과 같습니다. 'John', 'JOHN', 'john', 'JoHn'처럼 대소문자 조합이 어떻게 되어 있든 'john'이라는 단어가 포함된 모든 문서가 조회됩니다.

{ "_id" : ObjectId("5cdffc25bf3115999ed51210"), "UserName" : "John" }
{ "_id" : ObjectId("5cdffc2ebf3115999ed51211"), "UserName" : "JOHN" }
{ "_id" : ObjectId("5cdffc35bf3115999ed51212"), "UserName" : "john" }
{ "_id" : ObjectId("5cdffc3ebf3115999ed51213"), "UserName" : "JoHn" }

정리

$regex는 MongoDB에서 부분 문자열 검색이나 패턴 기반 조회를 수행할 때 매우 유용한 연산자입니다. 기본적으로 대소문자를 구분하며, $options: 'i' 옵션을 함께 사용하면 대소문자를 무시한 검색이 가능합니다. 다만 대규모 컬렉션에서 비앵커(anchor) 정규식을 사용하면 인덱스를 활용하지 못해 성능이 저하될 수 있으므로, 가능하면 '^' 접두사 패턴을 사용하는 것이 좋습니다.