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

MongoDB에서 $regex에 필드 값을 패턴으로 사용하는 방법 ($indexOfCP 활용)

MongoDB에서 필드 값을 패턴으로 사용할 수 있을까요?

네, 가능합니다. 다만 일반적인 $regex 연산자로는 다른 필드의 값을 패턴으로 직접 지정할 수 없습니다. 대신 $indexOfCP 연산자를 애그리게이션 프레임워크(aggregate framework)와 함께 활용하면 원하는 결과를 얻을 수 있습니다.

$indexOfCP는 특정 문자열 안에서 찾고자 하는 문자열이 처음 나타나는 위치(코드 포인트 기준)를 반환하고, 문자열을 찾지 못하면 -1을 반환합니다. 이 특성을 이용하면 한 필드의 값이 다른 필드 값에 포함되어 있는지 손쉽게 확인할 수 있습니다.

1. 샘플 컬렉션 생성

먼저 문서를 담은 컬렉션을 생성해 보겠습니다.

> db.patterDemo.insertOne(
   {
      "ClientName": "John", "ClientWebsiteName": "webbuziness.com/John/business"
   }
);
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cea40acef71edecf6a1f68d")
}
> db.patterDemo.insertOne(
   {
      "ClientName": "Carol", "ClientWebsiteName": "solvecoding.com/business"
   }
);
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cea40acef71edecf6a1f68e")
}

2. 전체 문서 조회

find() 메서드를 사용해 컬렉션의 모든 문서를 확인해 보겠습니다.

> db.patterDemo.find().pretty();

위 쿼리는 다음과 같은 결과를 출력합니다.

{
   "_id" : ObjectId("5cea40acef71edecf6a1f68d"),
   "ClientName" : "John",
   "ClientWebsiteName" : "webbuziness.com/John/business"
}
{
   "_id" : ObjectId("5cea40acef71edecf6a1f68e"),
   "ClientName" : "Carol",
   "ClientWebsiteName" : "solvecoding.com/business"
}

3. 필드 값을 패턴처럼 활용하는 쿼리

이제 클라이언트 이름(ClientName)이 웹사이트 이름(ClientWebsiteName)에 포함되어 있는 문서만 조회해 보겠습니다.

> db.patterDemo.aggregate([
   {
      "$match": {
         "$expr": {
            "$ne": [
               { "$indexOfCP": ["$ClientWebsiteName", "$ClientName"] },
               -1
            ]
         }
      }
   }
]);

여기서 $expr 연산자는 애그리게이션 표현식을 $match 단계에서 사용할 수 있도록 해줍니다. $indexOfCP의 결과가 -1(문자열 미발견)이 아닌 경우, 즉 ClientName이 ClientWebsiteName 안에 실제로 존재하는 문서만 최종 결과에 포함됩니다.

위 쿼리는 다음과 같은 결과를 출력합니다.

{ "_id" : ObjectId("5cea40acef71edecf6a1f68d"), "ClientName" : "John", "ClientWebsiteName" : "webbuziness.com/John/business" }

결과를 보면 "John"이라는 이름이 웹사이트 URL에 포함된 첫 번째 문서만 반환된 것을 확인할 수 있습니다. 반면 "Carol"은 웹사이트 이름에 포함되어 있지 않기 때문에 결과에서 제외되었습니다.

마무리

이처럼 MongoDB에서는 $regex에 직접 필드 값을 넣을 수 없지만, $indexOfCP와 $expr을 조합한 애그리게이션 파이프라인을 사용하면 동일한 효과를 얻을 수 있습니다. 두 필드 간의 포함 관계를 동적으로 확인해야 하는 상황에서 매우 유용하게 활용할 수 있습니다.