MongoDB에서 쿼리 결과를 변수에 저장하고 싶다면 aggregate() 메서드를 활용할 수 있습니다. 이번 글에서는 실제 예제를 통해 집계 결과를 변수에 담고, 그중 원하는 값을 추출하는 과정을 단계별로 살펴보겠습니다.
1. 샘플 컬렉션 생성하기
먼저 여러 개의 문서를 포함하는 컬렉션을 생성합니다.
> db.demo142.insertOne({"Value":50});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e32e9c6fdf09dd6d08539b2")
}
> db.demo142.insertOne({"Value":45});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e32e9cafdf09dd6d08539b3")
}
> db.demo142.insertOne({"Value":60});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e32e9cdfdf09dd6d08539b4")
}
> db.demo142.insertOne({"Value":55});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e32e9d0fdf09dd6d08539b5")
}
> db.demo142.insertOne({"Value":50});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e32e9d9fdf09dd6d08539b6")
}
2. find()로 전체 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.
> db.demo142.find();
위 명령을 실행하면 다음과 같은 출력 결과가 나타납니다.
{ "_id" : ObjectId("5e32e9c6fdf09dd6d08539b2"), "Value" : 50 }
{ "_id" : ObjectId("5e32e9cafdf09dd6d08539b3"), "Value" : 45 }
{ "_id" : ObjectId("5e32e9cdfdf09dd6d08539b4"), "Value" : 60 }
{ "_id" : ObjectId("5e32e9d0fdf09dd6d08539b5"), "Value" : 55 }
{ "_id" : ObjectId("5e32e9d9fdf09dd6d08539b6"), "Value" : 50 }
3. 쿼리 결과를 변수에 푸시하기
이제 aggregate()를 사용해 쿼리 결과를 변수에 저장하는 핵심 쿼리를 살펴보겠습니다.
> var query = db.demo142.aggregate(
... { "$group": { "_id": null, "MaxValue": { "$max": "$Value" } } }
... ]);
> var largestValue= query.toArray()[0]["MaxValue"];
> printjson(largestValue);
쿼리 동작 원리
이 쿼리는 세 단계로 동작합니다.
$group 스테이지에서 _id를 null로 지정하면 모든 문서가 하나의 그룹으로 묶입니다. 이때 $max 연산자를 사용해 Value 필드의 최댓값을 계산하여 MaxValue라는 새 필드에 저장합니다.
그다음 toArray() 메서드로 커서를 배열로 변환한 뒤, 첫 번째 요소에서 MaxValue 값을 꺼내 largestValue 변수에 할당합니다. 마지막으로 printjson()으로 해당 변수의 내용을 출력합니다.
4. 실행 결과 확인
쿼리를 실행하면 다음과 같이 Value 필드의 최댓값인 60이 출력됩니다.
60
이처럼 aggregate()와 $group, $max 연산자를 조합하면 쿼리 결과를 손쉽게 변수에 저장하고, 자바스크립트 로직에서 재사용할 수 있습니다. 최솟값이나 평균값 등 다른 통계 값이 필요한 경우에도 $min, $avg 연산자로 동일한 패턴을 적용하면 됩니다.