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

MongoDB에서 SQL의 'LIKE'처럼 문자열 검색하는 방법 (정규표현식 활용)

SQL의 LIKE 연산자와 같은 부분 일치 검색을 MongoDB에서 구현하려면 find() 메서드와 정규 표현식(//)을 함께 사용하면 됩니다. 이번 글에서는 예제를 통해 실제 동작 방식을 단계별로 살펴보겠습니다.

1. 컬렉션 생성 및 문서 삽입

먼저 데모용 컬렉션을 만들고 여러 개의 문서를 삽입합니다. 여기서는 대소문자가 서로 다른 이름들을 의도적으로 함께 저장했습니다.

> db.demo686.insertOne({"FirstName":"Robert"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5ea55182a7e81adc6a0b395c")
}
> db.demo686.insertOne({"FirstName":"John"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5ea55186a7e81adc6a0b395d")
}
> db.demo686.insertOne({"FirstName":"ROBERT"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5ea5518fa7e81adc6a0b395e")
}
> db.demo686.insertOne({"FirstName":"David"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5ea55195a7e81adc6a0b395f")
}
> db.demo686.insertOne({"FirstName":"robert"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5ea5519ba7e81adc6a0b3960")
}

2. 전체 문서 조회하기

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

> db.demo686.find();

위 명령을 실행하면 다음과 같은 결과가 출력됩니다.

{ "_id" : ObjectId("5ea55182a7e81adc6a0b395c"), "FirstName" : "Robert" }
{ "_id" : ObjectId("5ea55186a7e81adc6a0b395d"), "FirstName" : "John" }
{ "_id" : ObjectId("5ea5518fa7e81adc6a0b395e"), "FirstName" : "ROBERT" }
{ "_id" : ObjectId("5ea55195a7e81adc6a0b395f"), "FirstName" : "David" }
{ "_id" : ObjectId("5ea5519ba7e81adc6a0b3960"), "FirstName" : "robert" }

3. 'LIKE'와 유사한 쿼리 작성하기

이제 SQL의 LIKE '%Robert%'와 비슷한 역할을 하는 쿼리를 작성해 보겠습니다. MongoDB에서는 슬래시(/)로 감싼 정규 표현식을 조건으로 사용할 수 있으며, 뒤에 붙인 i 옵션은 대소문자를 구분하지 않겠다는 의미입니다.

> db.demo686.find({FirstName:/Robert/i});

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

{ "_id" : ObjectId("5ea55182a7e81adc6a0b395c"), "FirstName" : "Robert" }
{ "_id" : ObjectId("5ea5518fa7e81adc6a0b395e"), "FirstName" : "ROBERT" }
{ "_id" : ObjectId("5ea5519ba7e81adc6a0b3960"), "FirstName" : "robert" }

결과를 보면 “Robert”, “ROBERT”, “robert”처럼 대소문자와 관계없이 “robert”라는 문자열이 포함된 모든 문서가 반환된 것을 확인할 수 있습니다. 반면 “John”, “David”는 검색 조건에 맞지 않아 제외되었습니다.

$regex 연산자를 사용하는 방법

슬래시 표기법 외에도 $regex 연산자를 사용하면 동일한 결과를 얻을 수 있습니다. 특히 드라이버나 프레임워크에서 쿼리를 동적으로 조립할 때는 이 방식이 더 편리합니다.

> db.demo686.find({ FirstName: { $regex: "Robert", $options: "i" } });

성능 팁: 접두어 검색 시 인덱스 활용

검색어가 항상 문자열 앞부분과 일치하는 경우(예: LIKE 'Robert%')에는 ^ 앵커를 사용하는 것이 좋습니다. { FirstName: /^Robert/ }처럼 시작 위치를 고정하면 해당 필드에 생성된 인덱스를 활용할 수 있어 대량의 데이터에서도 검색 속도가 크게 향상됩니다. 반면 중간 일치(%...%) 패턴은 인덱스를 사용하지 못하므로, 전문 검색이 자주 필요하다면 Atlas Search 같은 전용 검색 인덱스를 고려하는 것이 좋습니다.