MongoDB에서 $in 연산자와 함께 정규식(Regular Expression)을 사용할 수 있을까요? 답은 예입니다. $in 배열 안에 정규식 패턴을 직접 넣으면, 해당 패턴과 일치하는 값을 가진 문서를 손쉽게 조회할 수 있습니다.
1. 샘플 컬렉션 생성하기
먼저 데모용 컬렉션을 만들고 문서를 삽입해 보겠습니다. 각 문서는 이름 목록(ListOfNames)을 배열 형태로 가지고 있습니다.
> db.demo675.insertOne({
... "ListOfNames":["John","Chris","David"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea3f5b404263e90dac943ef")
}
> db.demo675.insertOne({ "ListOfNames":["Bob","Johnson","Sam"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea3f5c804263e90dac943f0")
}
> db.demo675.insertOne({ "ListOfNames":["Jace","Sam"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea3f5d304263e90dac943f1")
}2. find() 메서드로 전체 문서 조회하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.demo675.find();
위 쿼리는 다음과 같은 결과를 출력합니다.
{ "_id" : ObjectId("5ea3f5b404263e90dac943ef"), "ListOfNames" : [ "John", "Chris", "David" ] }
{ "_id" : ObjectId("5ea3f5c804263e90dac943f0"), "ListOfNames" : [ "Bob", "Johnson", "Sam" ] }
{ "_id" : ObjectId("5ea3f5d304263e90dac943f1"), "ListOfNames" : [ "Jace", "Sam" ] }3. $in과 정규식을 조합한 쿼리 실행하기
이제 $in 연산자 안에 정규식 패턴을 넣어 배열 필드를 조회해 보겠습니다. 아래 예시에서는 /John/과 /J/라는 두 개의 정규식 패턴을 사용했습니다.
> db.demo675.find({"ListOfNames": {$in:[/John/,/]}});실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5ea3f5b404263e90dac943ef"), "ListOfNames" : [ "John", "Chris", "David" ] }
{ "_id" : ObjectId("5ea3f5c804263e90dac943f0"), "ListOfNames" : [ "Bob", "Johnson", "Sam" ] }
{ "_id" : ObjectId("5ea3f5d304263e90dac943f1"), "ListOfNames" : [ "Jace", "Sam" ] }결과 분석
모든 세 개의 문서가 조회된 이유를 살펴보겠습니다.
- 첫 번째 문서:
John이/John/패턴과 일치합니다. - 두 번째 문서:
Johnson이/J/패턴(J로 시작)과 일치합니다. - 세 번째 문서:
Jace역시/J/패턴과 일치합니다.
즉, $in 내부의 정규식은 배열 요소 중 하나라도 패턴에 부합하면 해당 문서를 반환합니다. 대소문자를 구분하지 않으려면 /pattern/i처럼 i 옵션 플래그를 추가하면 됩니다.