MongoDB에서 LIKE 쿼리 구현하기
SQL의 LIKE 연산자처럼 특정 패턴과 일치하는 문자열을 검색하려면, MongoDB에서는 정규 표현식(Regex)을 활용하면 됩니다. 이 글에서는 실제 예제를 통해 MongoDB에서 LIKE와 유사한 방식으로 레코드를 조회하는 방법을 단계별로 살펴보겠습니다.
1. 샘플 컬렉션 생성
먼저 문서(document)를 포함하는 컬렉션을 생성합니다.
> db.likeDemo.insertOne({"Name":"John",Age:32});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cb84984623186894665ae41")
}
> db.likeDemo.insertOne({"Name":"Chris",Age:25});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cb84991623186894665ae42")
}
> db.likeDemo.insertOne({"Name":"Carol",Age:22});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cb849a1623186894665ae43")
}
> db.likeDemo.insertOne({"Name":"Johnny",Age:22});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cb849b2623186894665ae44")
}
> db.likeDemo.insertOne({"Name":"James",Age:27});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cb849bb623186894665ae45")
}위 명령은 'likeDemo'라는 컬렉션에 이름과 나이 정보를 가진 다섯 개의 문서를 삽입합니다.
2. 전체 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.likeDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5cb84984623186894665ae41"),
"Name" : "John",
"Age" : 32
}
{
"_id" : ObjectId("5cb84991623186894665ae42"),
"Name" : "Chris",
"Age" : 25
}
{
"_id" : ObjectId("5cb849a1623186894665ae43"),
"Name" : "Carol",
"Age" : 22
}
{
"_id" : ObjectId("5cb849b2623186894665ae44"),
"Name" : "Johnny",
"Age" : 22
}
{
"_id" : ObjectId("5cb849bb623186894665ae45"),
"Name" : "James",
"Age" : 27
}3. LIKE와 유사한 패턴 매칭 쿼리 실행
이제 정규 표현식을 사용해 SQL의 LIKE 'Jo%'와 동일한 결과, 즉 Name 필드가 "Jo"로 시작하는 레코드를 조회해 보겠습니다.
> db.likeDemo.find({Name: /^Jo/i } ).pretty();여기서 사용된 정규 표현식의 의미는 다음과 같습니다.
- ^ : 문자열의 시작을 나타냅니다.
- /i : 대소문자를 구분하지 않도록 하는 옵션(case-insensitive)입니다.
실행 결과, "Jo"로 시작하는 두 개의 문서만 반환됩니다.
{
"_id" : ObjectId("5cb84984623186894665ae41"),
"Name" : "John",
"Age" : 32
}
{
"_id" : ObjectId("5cb849b2623186894665ae44"),
"Name" : "Johnny",
"Age" : 22
}추가: 다양한 LIKE 패턴 응용
정규 표현식의 위치를 조절하면 SQL LIKE의 여러 패턴을 그대로 재현할 수 있습니다.
특정 문자열로 끝나는 경우 (SQL의 LIKE '%n'):db.likeDemo.find({Name: /n$/ })
문자열 중간에 포함된 경우 (SQL의 LIKE '%oh%'):db.likeDemo.find({Name: /oh/ })
정확히 일치하는 경우 (SQL의 LIKE 'John'):db.likeDemo.find({Name: /^John$/ })
이처럼 MongoDB에서는 정규 표현식 하나로 SQL의 LIKE 연산자가 제공하는 대부분의 문자열 검색 기능을 손쉽게 구현할 수 있습니다. 다만, 대량의 데이터를 다룰 때는 인덱스를 활용할 수 있도록 접두사(prefix) 기반 검색(^으로 시작하는 패턴)을 사용하는 것이 성능 면에서 유리합니다.