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

MongoDB에서 필드 합계가 특정 값보다 큰 문서를 조회하는 방법 ($where 연산자 활용)

MongoDB에서 여러 필드 값의 합계가 특정 값보다 큰 문서를 조회해야 하는 경우가 있습니다. 이럴 때 $where 연산자를 사용하면 JavaScript 함수 기반의 조건으로 원하는 문서를 손쉽게 필터링할 수 있습니다. 이 글에서는 실제 예제를 통해 그 사용법을 단계별로 살펴보겠습니다.

1. 테스트 컬렉션 생성하기

먼저 예제에 사용할 컬렉션을 만들고 문서를 삽입하겠습니다. insertOne() 메서드를 사용하여 Price1, Price2, Price3 세 개의 가격 필드를 가진 문서들을 추가합니다.

> db.sumOfFieldIsGreaterThanDemo.insertOne({"Price1":10,"Price2":50,"Price3":40});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cdd84b8bf3115999ed511e6")
}
> db.sumOfFieldIsGreaterThanDemo.insertOne({"Price1":11,"Price2":1,"Price3":120});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cdd84c6bf3115999ed511e7")
}
> db.sumOfFieldIsGreaterThanDemo.insertOne({"Price1":10,"Price2":9,"Price3":6});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cdd84d2bf3115999ed511e8")
}

2. 저장된 전체 문서 확인하기

find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.

> db.sumOfFieldIsGreaterThanDemo.find();

위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.

{ "_id" : ObjectId("5cdd84b8bf3115999ed511e6"), "Price1" : 10, "Price2" : 50, "Price3" : 40 }
{ "_id" : ObjectId("5cdd84c6bf3115999ed511e7"), "Price1" : 11, "Price2" : 1, "Price3" : 120 }
{ "_id" : ObjectId("5cdd84d2bf3115999ed511e8"), "Price1" : 10, "Price2" : 9, "Price3" : 6 }

3. $where 연산자로 필드 합계 조건 조회하기

이제 $where 연산자와 JavaScript 함수를 활용하여 Price1, Price2, Price3 필드의 합계가 100보다 큰 문서만 선택하는 쿼리를 살펴보겠습니다.

> db.sumOfFieldIsGreaterThanDemo.find(
   {$where: function() {
      return this.Price1+this.Price2+this.Price3 > 100
   }}
);

실행 결과, 세 필드의 합계가 100을 초과하는 문서만 반환됩니다.

{ "_id" : ObjectId("5cdd84c6bf3115999ed511e7"), "Price1" : 11, "Price2" : 1, "Price3" : 120 }

참고 사항

$where 연산자는 각 문서마다 JavaScript 코드를 실행하기 때문에 성능 비용이 큽니다. 대량의 데이터를 다룰 때는 MongoDB 3.6 이상에서 제공되는 $expr 연산자나 애그리게이션 파이프라인을 사용하는 것이 더 효율적입니다. 또한 $where는 인덱스를 활용할 수 없으므로, 일반적인 쿼리 연산자로 해결할 수 있는 상황이라면 해당 방식을 우선적으로 고려하는 것이 좋습니다.