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

MongoDB 집계 프레임워크에서 필드 간 값 비교하는 방법 ($cmp 연산자 활용)

MongoDB 집계 프레임워크에서 필드 간 값 비교하기

MongoDB에서 일반적인 find() 쿼리로는 동일한 문서 내에 있는 두 필드의 값을 직접 비교할 수 없습니다. 이런 경우 집계 프레임워크(Aggregation Framework)$cmp 연산자를 활용하면 해결할 수 있습니다.

$cmp 연산자는 두 개의 값을 비교하여 다음과 같은 결과를 반환합니다.

  • 첫 번째 값이 두 번째 값보다 크면 1
  • 두 값이 같으면 0
  • 첫 번째 값이 두 번째 값보다 작으면 -1

1. 샘플 컬렉션 생성

개념을 이해하기 위해 먼저 문서가 포함된 컬렉션을 생성해 보겠습니다. 컬렉션 생성 쿼리는 다음과 같습니다.

> db.matchBetweenFieldsDemo.insertOne({"FirstValue":40,"SecondValue":70});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c92c9625259fcd19549980d")
}
> db.matchBetweenFieldsDemo.insertOne({"FirstValue":20,"SecondValue":5});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c92c96b5259fcd19549980e")
}

2. 저장된 문서 확인

find() 메서드를 사용하면 컬렉션의 모든 문서를 조회할 수 있습니다.

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

실행 결과는 다음과 같습니다.

{
    "_id" : ObjectId("5c92c9625259fcd19549980d"),
    "FirstValue" : 40,
    "SecondValue" : 70
}
{
    "_id" : ObjectId("5c92c96b5259fcd19549980e"),
    "FirstValue" : 20,
    "SecondValue" : 5
}

3. $project와 $match로 필드 간 비교 수행

이제 집계 프레임워크에서 $project 단계와 $match 단계를 조합하여 두 필드를 비교하는 쿼리를 살펴보겠습니다.

> db.matchBetweenFieldsDemo.aggregate([
    ... {$project: {
        ... firstGreaterThanOrNot: {$cmp: ['$FirstValue', '$SecondValue']}
    ... }},
    ... {$match: {firstGreaterThanOrNot:{$gt: 0}}}
... ]);

위 쿼리의 동작 방식을 단계별로 정리하면 다음과 같습니다.

  • $project: 각 문서에서 FirstValue와 SecondValue를 $cmp로 비교한 결과를 firstGreaterThanOrNot이라는 새 필드에 저장합니다.
  • $match: firstGreaterThanOrNot 값이 0보다 큰, 즉 FirstValue가 SecondValue보다 큰 문서만 필터링합니다.

실행 결과는 다음과 같습니다.

{ "_id" : ObjectId("5c92c96b5259fcd19549980e"), "firstGreaterThanOrNot" : 1 }

결과를 보면 FirstValue(20)가 SecondValue(5)보다 큰 두 번째 문서만 반환된 것을 확인할 수 있습니다. 만약 FirstValue가 SecondValue보다 작은 문서를 찾고 싶다면 $match 조건을 {$lt: 0}으로 변경하면 됩니다. 이처럼 $cmp와 $match를 조합하면 문서 내부의 필드 간 관계를 손쉽게 검증할 수 있습니다.