MongoDB에서 정렬과 그룹화를 한 번에 처리하는 방법
하나의 쿼리에서 정렬(sorting)과 그룹화(grouping)를 동시에 수행하려면 MongoDB의 집계 프레임워크(aggregate framework)와 $group 연산자를 함께 사용하면 됩니다. 이 글에서는 실제 예제를 통해 단계별로 살펴보겠습니다.
1. 샘플 컬렉션 생성하기
먼저 insertOne() 메서드를 사용해 테스트용 문서들을 담은 컬렉션을 만들어 보겠습니다.
> db.sortAndGroupDemo.insertOne({
Price : 40,
Product: 10
});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ce8f2bc78f00858fb12e907")
}
> db.sortAndGroupDemo.insertOne({
Price : 100,
Product: 10
});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ce8f2bc78f00858fb12e908")
}
> db.sortAndGroupDemo.insertOne({
Price : 90,
Product: 20
});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ce8f2bc78f00858fb12e909")
}
> db.sortAndGroupDemo.insertOne({
Price : 200,
Product: 10
});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ce8f2bc78f00858fb12e90a")
}
> db.sortAndGroupDemo.insertOne({
Price : 70,
Product: 20
});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ce8f2bc78f00858fb12e90b")
}
> db.sortAndGroupDemo.insertOne({
Price : 70,
Product: 30
});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ce8f2bd78f00858fb12e90c")
}위 코드는 sortAndGroupDemo라는 컬렉션에 가격(Price)과 제품(Product) 정보를 가진 6개의 문서를 삽입합니다.
2. 저장된 전체 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.
> db.sortAndGroupDemo.find().pretty();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : ObjectId("5ce8f2bc78f00858fb12e907"),
"Price" : 40,
"Product" : 10
}
{
"_id" : ObjectId("5ce8f2bc78f00858fb12e908"),
"Price" : 100,
"Product" : 10
}
{
"_id" : ObjectId("5ce8f2bc78f00858fb12e909"),
"Price" : 90,
"Product" : 20
}
{
"_id" : ObjectId("5ce8f2bc78f00858fb12e90a"),
"Price" : 200,
"Product" : 10
}
{
"_id" : ObjectId("5ce8f2bc78f00858fb12e90b"),
"Price" : 70,
"Product" : 20
}
{
"_id" : ObjectId("5ce8f2bd78f00858fb12e90c"),
"Price" : 70,
"Product" : 30
}3. 집계 파이프라인으로 그룹화 후 정렬하기
이제 핵심 부분입니다. aggregate() 메서드 안에 $group, $sort, $project 스테이지를 순서대로 배치하여, 하나의 집계 쿼리로 그룹화와 정렬을 동시에 처리할 수 있습니다.
> db.sortAndGroupDemo.aggregate(
[
{ "$group": { "_id": "$Product" }},
{ "$sort" : { "Price": 1 }},
{ "$project":{"_id":1 }}
]
);
각 스테이지의 역할을 간단히 설명하면 다음과 같습니다.
- $group: Product 필드 값을 기준으로 문서들을 그룹화합니다.
- $sort: Price 필드를 기준으로 오름차순(1) 정렬합니다. 내림차순으로 정렬하려면 값을 -1로 지정하면 됩니다.
- $project: 결과에서 _id 필드만 포함하도록 출력 형태를 지정합니다.
위 집계 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : 30 }
{ "_id" : 20 }
{ "_id" : 10 }마무리
이처럼 MongoDB의 집계 프레임워크를 활용하면 별도의 쿼리를 여러 번 실행할 필요 없이, $group으로 데이터를 그룹화하고 $sort로 정렬하는 작업을 하나의 파이프라인 안에서 효율적으로 처리할 수 있습니다. 집계 파이프라인은 스테이지 순서대로 데이터가 흐르며 변환되기 때문에, 원하는 출력 형태에 따라 $match나 $project 같은 다른 스테이지를 추가로 조합하면 더욱 강력한 데이터 처리가 가능합니다.