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

MongoDB에서 SQL LIKE 절과 동일한 기능 구현하기 – $regex 연산자 완벽 가이드

관계형 데이터베이스의 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" 등 대소문자와 관계없이 일치하는 모든 문서를 조회할 수 있습니다.