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

MongoDB 집계(Aggregation) 쿼리 하나로 정렬과 그룹화 동시에 처리하기

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 같은 다른 스테이지를 추가로 조합하면 더욱 강력한 데이터 처리가 가능합니다.