MongoDB에서 배열 내부의 필드 합계 구하기
MongoDB에서 배열 안에 포함된 필드 값들의 합계를 계산하려면 집계 파이프라인(Aggregation Pipeline)에서 $sum 연산자를 사용하면 됩니다. 먼저 예제로 사용할 컬렉션과 문서를 생성해 보겠습니다.
> db.demo96.insertOne(
... {
...
... "Name" : "Chris",
... "Details" : [
... {
... Marks:67
... },
... {
... Marks:33
... },
... {
... Marks:50
... }
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e2d6aadb8903cdd865577ad")
}
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.demo96.find();
위 명령을 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : ObjectId("5e2d6aadb8903cdd865577ad"), "Name" : "Chris", "Details" : [
{ "Marks" : 67 }, { "Marks" : 33 }, { "Marks" : 50 }
]
}배열 내부 필드 합계를 구하는 쿼리
다음은 MongoDB에서 배열 내부 필드의 합계를 구하는 쿼리입니다. $project 단계에서 $sum 연산자를 사용하면 Details 배열의 모든 Marks 값을 한 번에 합산할 수 있습니다.
> db.demo96.aggregate([
... { "$project": {
... "Name": 1,
... "TotalMarks": {
... "$sum": "$Details.Marks"
... }
... }}
... ]);
쿼리를 실행하면 다음과 같이 합계가 계산된 결과가 출력됩니다. 이 예제에서는 67 + 33 + 50 = 150이므로 TotalMarks 필드에 150이 반환됩니다.
{ "_id" : ObjectId("5e2d6aadb8903cdd865577ad"), "Name" : "Chris", "TotalMarks" : 150 }쿼리 동작 원리
- $project: 최종 결과에 포함할 필드를 지정합니다.
- Name: 1: 기존의 Name 필드를 그대로 결과에 포함시킵니다.
- TotalMarks: { $sum: "$Details.Marks" }: Details 배열 내 모든 문서의 Marks 값을 순회하며 합산한 결과를 새로운 TotalMarks 필드로 생성합니다.
이처럼 $sum 연산자를 활용하면 별도의 반복문 없이 배열 내부의 숫자 필드 합계를 간단하고 효율적으로 계산할 수 있습니다.