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

MongoDB 하위 배열 문서 정렬 방법 – $sort 연산자 완벽 가이드

MongoDB에서 배열 안에 포함된 하위 문서(sub-document)를 정렬하려면 aggregate 집계 파이프라인과 $sort 연산자를 함께 사용해야 합니다. 이번 글에서는 학생 정보 배열을 이름(Name) 기준으로 오름차순 정렬하는 실전 예제를 단계별로 살펴보겠습니다.

1단계: 컬렉션 생성 및 문서 삽입

먼저 insertOne() 메서드를 사용하여 StudentDetails라는 하위 배열을 가진 문서를 생성합니다.

> db.demo23.insertOne(
...{
...
... "StudentDetails" : [{
... "Name" : "David",
... "Age" : 23,
...
... }, {
... "Name" : "Adam",
... "Age" : 24,
... }]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e14c3eb22d07d3b95082e71")
}

2단계: 저장된 문서 확인

find() 메서드를 사용하여 컬렉션의 모든 문서를 조회합니다.

> db.demo23.find().pretty()

위 명령을 실행하면 다음과 같은 결과가 출력됩니다.

{
"_id" : ObjectId("5e14c3eb22d07d3b95082e71"),
"StudentDetails" : [
{
"Name" : "David",
"Age" : 23
},
{
"Name" : "Adam",
"Age" : 24
}
]
}

현재 배열에는 David(23세)가 Adam(24세)보다 앞에 위치해 있습니다. 이제 이름을 기준으로 알파벳 순서대로 정렬해 보겠습니다.

3단계: $sort를 활용한 하위 배열 정렬 쿼리

다음은 하위 배열 문서에 $sort를 적용하는 전체 쿼리입니다.

> db.demo23.aggregate([
... { "$unwind" : "$StudentDetails"} ,
... { "$sort" : { "StudentDetails.Name" : 1}},
... { "$match" : { }} ,
... { "$group" : { "StudentDetails" : { "$push" : { "Name" : "$StudentDetails.Name"}} , "_id" : null}} ,
... { "$project" : { "_id" : 0 , "StudentDetails" : 1}}
... ]);

파이프라인 단계별 동작 원리

  • $unwind: StudentDetails 배열의 각 요소를 개별 문서로 분해합니다.
  • $sort: StudentDetails.Name 필드를 기준으로 오름차순(1) 정렬합니다. 내림차순이 필요하면 값을 -1로 변경하면 됩니다.
  • $match: 조건 없이 모든 문서를 통과시킵니다(필요 시 필터 조건을 추가할 수 있습니다).
  • $group: _id를 null로 지정하여 분리된 문서들을 하나로 다시 그룹화하고, $push 연산자로 Name 값만 새 배열에 담습니다.
  • $project: _id 필드를 제외하고 StudentDetails만 출력되도록 지정합니다.

실행 결과

{ "StudentDetails" : [ { "Name" : "Adam" }, { "Name" : "David" } ] }

결과를 보면 Adam이 David보다 앞에 위치하도록 이름 기준 오름차순 정렬이 성공적으로 적용된 것을 확인할 수 있습니다. 이처럼 $unwind → $sort → $group 조합은 MongoDB에서 중첩 배열 데이터를 정렬할 때 가장 널리 사용되는 패턴이며, 나이나 다른 필드 기준으로도 손쉽게 응용할 수 있습니다.