관계형 데이터베이스의 SQL에서는 LIKE 절을 사용해 부분 문자열 매칭 검색을 수행합니다. MongoDB에서는 이와 동일한 기능을 $regex 연산자를 통해 구현할 수 있습니다. 이 글에서는 실제 예제를 따라 하며 $regex 연산자의 사용법을 단계별로 살펴보겠습니다.
1. 샘플 컬렉션 생성하기
먼저 테스트에 사용할 컬렉션을 만들고 문서를 삽입하겠습니다. insertOne() 메서드를 사용해 사용자 정보를 하나씩 저장합니다.
> db.sqlLikeDemo.insertOne({"UserName":"John Smith","UserAge":24});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c912e124afe5c1d2279d6a5")
}
> db.sqlLikeDemo.insertOne({"UserName":"John Doe","UserAge":21});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c912e264afe5c1d2279d6a6")
}
> db.sqlLikeDemo.insertOne({"UserName":"Chris Williams","UserAge":22});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c912e404afe5c1d2279d6a7")
}
> db.sqlLikeDemo.insertOne({"UserName":"Robert Taylor","UserAge":26});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c912e4d4afe5c1d2279d6a8")
}
> db.sqlLikeDemo.insertOne({"UserName":"John Brown","UserAge":27});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c912e6c4afe5c1d2279d6a9")
}
> db.sqlLikeDemo.insertOne({"UserName":"Mike Brown","UserAge":23});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c912e794afe5c1d2279d6aa")
}
> db.sqlLikeDemo.insertOne({"UserName":"Larry Smith","UserAge":24});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c912e8c4afe5c1d2279d6ab")
}2. 저장된 전체 문서 확인하기
find() 메서드를 사용해 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.
> db.sqlLikeDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c912e124afe5c1d2279d6a5"),
"UserName" : "John Smith",
"UserAge" : 24
}
{
"_id" : ObjectId("5c912e264afe5c1d2279d6a6"),
"UserName" : "John Doe",
"UserAge" : 21
}
{
"_id" : ObjectId("5c912e404afe5c1d2279d6a7"),
"UserName" : "Chris Williams",
"UserAge" : 22
}
{
"_id" : ObjectId("5c912e4d4afe5c1d2279d6a8"),
"UserName" : "Robert Taylor",
"UserAge" : 26
}
{
"_id" : ObjectId("5c912e6c4afe5c1d2279d6a9"),
"UserName" : "John Brown",
"UserAge" : 27
}
{
"_id" : ObjectId("5c912e794afe5c1d2279d6aa"),
"UserName" : "Mike Brown",
"UserAge" : 23
}
{
"_id" : ObjectId("5c912e8c4afe5c1d2279d6ab"),
"UserName" : "Larry Smith",
"UserAge" : 24
}3. $regex 연산자로 SQL LIKE 흉내 내기
SQL의 WHERE UserName LIKE '%John%'과 동일한 결과를 얻으려면 아래처럼 $regex 연산자를 사용하면 됩니다. 이름에 "John"이 포함된 모든 문서가 조회됩니다.
> db.sqlLikeDemo.find({"UserName":{"$regex": "John"}}).pretty();실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c912e124afe5c1d2279d6a5"),
"UserName" : "John Smith",
"UserAge" : 24
}
{
"_id" : ObjectId("5c912e264afe5c1d2279d6a6"),
"UserName" : "John Doe",
"UserAge" : 21
}
{
"_id" : ObjectId("5c912e6c4afe5c1d2279d6a9"),
"UserName" : "John Brown",
"UserAge" : 27
}4. 알아두면 유용한 정규식 패턴
$regex 연산자는 정규식 기반이므로, 앵커 문자를 조합하면 SQL LIKE의 다양한 패턴을 그대로 재현할 수 있습니다.
{"$regex": "John"}→ SQL의LIKE '%John%'(문자열 어디든 포함){"$regex": "^John"}→ SQL의LIKE 'John%'(문자열 시작 일치){"$regex": "Smith$"}→ SQL의LIKE '%Smith'(문자열 끝 일치)
또한 대소문자를 구분하지 않고 검색하려면 $options에 "i" 값을 추가하면 됩니다.
> db.sqlLikeDemo.find({"UserName":{"$regex": "john", "$options": "i"}}).pretty();이렇게 하면 "JOHN", "john", "John" 등 대소문자와 관계없이 일치하는 모든 문서를 조회할 수 있습니다.