MongoDB에서 두 개의 속성(필드) 값을 더한 결과를 기준으로 문서를 검색하려면 애그리게이션 프레임워크(Aggregation Framework)를 활용하는 것이 가장 효과적입니다. 이 글에서는 $add 연산자로 두 필드의 합계를 계산한 뒤, $match 단계에서 특정 숫자보다 작은 값의 문서만 필터링하는 방법을 단계별로 살펴보겠습니다.
1. 샘플 컬렉션 생성하기
먼저 실습에 사용할 문서들이 담긴 컬렉션을 생성합니다. 각 문서는 Value1과 Value2라는 두 개의 숫자 필드를 가지고 있습니다.
> db.searchDocumentsDemo.insertOne({"Value1":100,"Value2":560});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd3fe1eedc6604c74817ce9")
}
> db.searchDocumentsDemo.insertOne({"Value1":300,"Value2":150});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd3fe29edc6604c74817cea")
}
> db.searchDocumentsDemo.insertOne({"Value1":400,"Value2":200});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd3fe30edc6604c74817ceb")
}
> db.searchDocumentsDemo.insertOne({"Value1":190,"Value2":210});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd3fe45edc6604c74817cec")
}2. 저장된 전체 문서 확인하기
find() 메서드와 pretty()를 함께 사용하면 컬렉션에 저장된 모든 문서를 보기 좋게 출력할 수 있습니다.
> db.searchDocumentsDemo.find().pretty();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : ObjectId("5cd3fe1eedc6604c74817ce9"),
"Value1" : 100,
"Value2" : 560
}
{
"_id" : ObjectId("5cd3fe29edc6604c74817cea"),
"Value1" : 300,
"Value2" : 150
}
{
"_id" : ObjectId("5cd3fe30edc6604c74817ceb"),
"Value1" : 400,
"Value2" : 200
}
{
"_id" : ObjectId("5cd3fe45edc6604c74817cec"),
"Value1" : 190,
"Value2" : 210
}3. 두 필드의 합을 기준으로 문서 검색하기
이제 핵심 부분입니다. 애그리게이션 파이프라인에서 $project 단계로 Value1과 Value2를 더한 새로운 필드 totalValue를 만들고, 이어지는 $match 단계에서 totalValue가 500 미만인 문서만 걸러냅니다.
> db.searchDocumentsDemo.aggregate([
... { $project: {totalValue: { $add: [ "$Value1", "$Value2" ] } } },
... { $match: {totalValue: {$lt: 500 }} }
... ]);실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5cd3fe29edc6604c74817cea"), "totalValue" : 450 }
{ "_id" : ObjectId("5cd3fe45edc6604c74817cec"), "totalValue" : 400 }결과 분석
네 개의 문서 중 두 개만 조회되었습니다. 각 문서의 합계를 계산해 보면 그 이유를 알 수 있습니다.
- 100 + 560 = 660 → 조건 불일치 (500 이상)
- 300 + 150 = 450 → 조건 일치
- 400 + 200 = 600 → 조건 불일치 (500 이상)
- 190 + 210 = 400 → 조건 일치
마무리
이처럼 MongoDB에서는 여러 필드를 연산한 결과를 기준으로 문서를 조회해야 할 때, 일반적인 find() 쿼리 대신 애그리게이션 파이프라인을 사용해야 합니다. $project로 계산 필드를 만들고 $match로 필터링하는 이 패턴은 합계뿐 아니라 평균($avg), 곱셈($multiply) 등 다양한 산술 연산에도 동일하게 응용할 수 있으니 꼭 기억해 두시기 바랍니다.