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

MongoDB에서 두 필드의 합계를 기준으로 정렬하는 방법

MongoDB에서 두 필드 값의 합계를 기준으로 문서를 정렬하려면 애그리게이션 프레임워크(aggregate framework)를 사용해야 합니다. 일반적인 find() 메서드만으로는 계산된 값을 기준으로 정렬할 수 없기 때문에, $project와 $sort 스테이지를 조합하는 것이 표준적인 해결 방법입니다.

1. 샘플 컬렉션 생성

먼저 예제에 사용할 컬렉션을 만들고 문서를 삽입해 보겠습니다.

> db.orderByTwoFieldsDemo.insertOne({"Value1":10,"Value2":35});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5ca285576304881c5ce84baa")
}
> db.orderByTwoFieldsDemo.insertOne({"Value1":12,"Value2":5});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5ca2855f6304881c5ce84bab")
}
> db.orderByTwoFieldsDemo.insertOne({"Value1":55,"Value2":65});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5ca285686304881c5ce84bac")
}

2. 저장된 문서 확인하기

find() 메서드를 사용해 컬렉션의 모든 문서를 조회합니다.

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

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

{
   "_id" : ObjectId("5ca285576304881c5ce84baa"),
   "Value1" : 10,
   "Value2" : 35
}
{
   "_id" : ObjectId("5ca2855f6304881c5ce84bab"),
   "Value1" : 12,
   "Value2" : 5
}
{
   "_id" : ObjectId("5ca285686304881c5ce84bac"),
   "Value1" : 55,
   "Value2" : 65
}

3. 두 필드의 합계 기준으로 정렬하기

Case 1: 오름차순(ascending) 정렬

$add 연산자로 두 필드의 합계를 계산한 새 필드(orderBySumValue)를 만들고, 이 값을 기준으로 오름차순 정렬하는 쿼리입니다.

> db.orderByTwoFieldsDemo.aggregate(
... [
... {$project:{Value1:1, Value2:1, orderBySumValue:{$add: ["$Value1", "$Value2"]}}},
... {$sort:{orderBySumValue:1}}]
... );

실행 결과는 다음과 같습니다. 합계가 작은 순서대로 문서가 정렬된 것을 확인할 수 있습니다.

{ "_id" : ObjectId("5ca2855f6304881c5ce84bab"), "Value1" : 12, "Value2" : 5,
"orderBySumValue" : 17 }
{ "_id" : ObjectId("5ca285576304881c5ce84baa"), "Value1" : 10, "Value2" : 35,
"orderBySumValue" : 45 }
{ "_id" : ObjectId("5ca285686304881c5ce84bac"), "Value1" : 55, "Value2" : 65,
"orderBySumValue" : 120 }

Case 2: 내림차순(descending) 정렬

$sort 스테이지에서 정렬 방향을 -1로 지정하면 내림차순으로 정렬됩니다.

> db.orderByTwoFieldsDemo.aggregate( [ {$project:{Value1:1, Value2:1,
orderBySumValue:{$add: ["$Value1", "$Value2"]}}}, {$sort:{orderBySumValue:-1}}] );

이번에는 합계가 큰 문서부터 출력되는 것을 볼 수 있습니다.

{ "_id" : ObjectId("5ca285686304881c5ce84bac"), "Value1" : 55, "Value2" : 65,
"orderBySumValue" : 120 }
{ "_id" : ObjectId("5ca285576304881c5ce84baa"), "Value1" : 10, "Value2" : 35,
"orderBySumValue" : 45 }
{ "_id" : ObjectId("5ca2855f6304881c5ce84bab"), "Value1" : 12, "Value2" : 5,
"orderBySumValue" : 17 }

정리

핵심 동작 원리는 다음과 같습니다.

$project: $add 연산자를 사용해 Value1과 Value2의 합을 담는 새로운 계산 필드(orderBySumValue)를 생성합니다.
$sort: 계산된 합계 필드를 기준으로 1(오름차순) 또는 -1(내림차순)로 정렬합니다.

이 패턴은 두 필드뿐 아니라 세 개 이상의 필드 합계나 평균 등 다른 산술 연산($subtract, $multiply, $avg 등)에도 동일하게 응용할 수 있으므로, MongoDB에서 계산된 값을 기준으로 정렬해야 할 때 유용하게 활용할 수 있습니다.