MongoDB에서 중첩 배열을 정렬하는 방법
MongoDB에서 문서 내부에 포함된 중첩 배열(nested array)을 특정 필드 기준으로 정렬하려면 애그리게이션 프레임워크의 $unwind, $sort, $group 연산자를 함께 사용해야 합니다. 이 글에서는 실제 예제를 통해 그 과정을 단계별로 살펴보겠습니다.
1단계: 샘플 컬렉션 생성
먼저 중첩 배열을 가진 문서를 포함하는 컬렉션을 생성합니다.
> db.demo505.insertOne(
... {
... "details": [
... {
... Name:"Chris",
... "Score":58
... }, {
...
... Name:"Bob",
... "Score":45
... }, {
...
... Name:"John",
... "Score":68
... }, {
...
... Name:"David",
... "Score":46
... }
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e882a6b987b6e0e9d18f574")
}
2단계: 저장된 문서 확인
find() 메서드를 사용하여 컬렉션의 모든 문서를 조회합니다.
> db.demo505.find();
위 명령을 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5e882a6b987b6e0e9d18f574"), "details" : [
{ "Name" : "Chris", "Score" : 58 },
{ "Name" : "Bob", "Score" : 45 },
{ "Name" : "John", "Score" : 68 },
{ "Name" : "David", "Score" : 46 }
] }현재 details 배열의 요소들은 입력된 순서대로 저장되어 있으며, Score 값 기준으로는 정렬되어 있지 않습니다.
3단계: 중첩 배열 정렬 쿼리 실행
다음은 details 배열을 Score 필드를 기준으로 오름차순(1) 정렬하는 애그리게이션 쿼리입니다.
> db.demo505.aggregate([
... { $unwind: "$details" },
... { $sort: { "details.Score": 1 } },
... { $group: { _id: "$_id", details: { $push: "$details" } } }
... ]);
각 파이프라인 단계의 역할은 다음과 같습니다.
$unwind: details 배열의 각 요소를 개별 문서로 분해하여 정렬 대상을 만듭니다.
$sort: 분해된 문서들을 details.Score 값을 기준으로 오름차순으로 정렬합니다.
$group: 원래 문서의 _id를 기준으로 다시 그룹화하고, $push 연산자를 통해 정렬된 순서대로 details 배열을 재구성합니다.
쿼리를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
{ "_id" : ObjectId("5e882a6b987b6e0e9d18f574"), "details" : [
{ "Name" : "Bob", "Score" : 45 },
{ "Name" : "David", "Score" : 46 },
{ "Name" : "Chris", "Score" : 58 },
{ "Name" : "John", "Score" : 68 }
] }출력 결과를 보면 details 배열의 요소들이 Score 값(45 → 46 → 58 → 68)을 기준으로 오름차순으로 정렬된 것을 확인할 수 있습니다. 내림차순으로 정렬하고 싶다면 $sort 단계에서 정렬 값을 -1로 지정하면 됩니다.