MongoDB에서 하위 문서를 정렬하고 조회하는 방법
MongoDB에서 하위 문서(subdocument)의 데이터를 정렬하려면 집계 파이프라인(aggregation pipeline)에서 $sort 연산자를 사용합니다. 이 글에서는 컬렉션을 생성하고, $unwind와 $project를 활용해 하위 문서의 필드를 추출한 뒤, 이름 기준으로 내림차순 정렬하는 전체 과정을 단계별로 살펴봅니다.
1. 샘플 컬렉션 생성하기
먼저 insertOne() 메서드를 사용해 데모용 컬렉션에 문서를 삽입합니다. 각 문서는 details라는 하위 문서를 포함하고 있습니다.
> db.demo236.insertOne({"details":{"Name":"Chris","Age":21}});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e419015f4cebbeaebec514c")
}
> db.demo236.insertOne({"details":{"Name":"David","Age":23}});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e41901cf4cebbeaebec514d")
}
> db.demo236.insertOne({"details":{"Name":"Bob","Age":24}});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e419023f4cebbeaebec514e")
}2. 저장된 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.demo236.find();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5e419015f4cebbeaebec514c"), "details" : { "Name" : "Chris", "Age" : 21 } }
{ "_id" : ObjectId("5e41901cf4cebbeaebec514d"), "details" : { "Name" : "David", "Age" : 23 } }
{ "_id" : ObjectId("5e419023f4cebbeaebec514e"), "details" : { "Name" : "Bob", "Age" : 24 } }3. 하위 문서 정렬·선택·조회 쿼리 작성하기
이제 aggregate() 메서드와 함께 $unwind, $project, $sort 스테이지를 조합하여 하위 문서의 필드를 추출하고 정렬하는 쿼리를 작성해 보겠습니다.
> db.demo236.aggregate(
... [
... { $unwind: "$details" },
... { $project: {
... Name: '$details.Name',
... Age: '$details.Age'
... }},
... { $sort: {Name: -1}}
... ]
... );각 스테이지의 역할은 다음과 같습니다.
- $unwind: details 하위 문서를 개별 문서로 분해하여 처리하기 쉽게 만듭니다.
- $project: Name과 Age 필드만 선택적으로 출력하여 원하는 데이터만 조회합니다.
- $sort: Name 필드를 기준으로 -1(내림차순) 정렬을 수행합니다. 오름차순으로 정렬하려면 1을 사용하면 됩니다.
4. 실행 결과 확인
위 집계 쿼리를 실행하면 이름 기준으로 내림차순 정렬된 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5e41901cf4cebbeaebec514d"), "Name" : "David", "Age" : 23 }
{ "_id" : ObjectId("5e419015f4cebbeaebec514c"), "Name" : "Chris", "Age" : 21 }
{ "_id" : ObjectId("5e419023f4cebbeaebec514e"), "Name" : "Bob", "Age" : 24 }마무리
이처럼 MongoDB의 집계 파이프라인을 활용하면 하위 문서 안에 중첩된 데이터도 손쉽게 추출하고 정렬할 수 있습니다. $unwind로 데이터를 평탄화한 후, $project로 필요한 필드만 선택하고, $sort로 원하는 순서대로 정렬하는 패턴은 실무에서 매우 자주 사용되므로 꼭 익혀두시기 바랍니다.