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

MongoDB에서 내부 배열을 정렬하는 방법 – 집계 프레임워크 완벽 가이드

MongoDB에서 문서(document) 안에 중첩된 배열을 정렬하려면 aggregate(집계) 프레임워크를 활용하면 됩니다. 이 글에서는 실제 예제를 통해 내부 배열을 오름차순과 내림차순으로 정렬하는 과정을 단계별로 살펴보겠습니다.

1. 샘플 컬렉션 및 문서 생성

먼저 연습용 컬렉션을 만들고 문서를 삽입합니다. 아래 쿼리는 직원 주소 정보가 중첩된 배열 형태로 들어 있는 문서를 생성하는 예시입니다.

> db.sortInnerArrayDemo.insertOne(
...     {
...       "EmployeeDetails":
...       {
...          "EmployeeAddress":
...          {
...             "EmployeeCountry":
...             [
...                {
...                  "EmployeeZipCode":1003,
...                  "EmployeeStreetName":"7885 Trusel Street"
...                },
...                {
...                  "EmployeeZipCode":1001,
...                  "EmployeeStreetName":"7390 Gonzales Drive"
...                },
...                {
...                  "EmployeeZipCode":1002,
...                  "EmployeeStreetName":"444 N.Myres Rd."
...                }
...             ]
...          }
...       }
...    }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c6f07d3da34711ecf87a5b8")
}

삽입이 성공하면 위와 같이 acknowledged: true와 함께 생성된 ObjectId가 반환됩니다.

2. 저장된 문서 확인하기

find() 메서드를 사용하면 컬렉션의 모든 문서를 조회할 수 있습니다.

> db.sortInnerArrayDemo.find().pretty();

실행 결과는 다음과 같습니다. EmployeeZipCode 값이 1003 → 1001 → 1002 순서로 뒤섞여 있는 것을 확인할 수 있습니다.

{
    "_id" : ObjectId("5c6f07d3da34711ecf87a5b8"),
    "EmployeeDetails" : {
        "EmployeeAddress" : {
            "EmployeeCountry" : [
            {
              "EmployeeZipCode" : 1003,
              "EmployeeStreetName" : "7885 Trusel Street"
            },
            {
              "EmployeeZipCode" : 1001,
              "EmployeeStreetName" : "7390 Gonzales Drive"
            },
            {
              "EmployeeZipCode" : 1002,
              "EmployeeStreetName" : "444 N.Myres Rd."
            }
        ]}
    }
}

3. 내부 배열 정렬하기

내부 배열을 정렬할 때는 집계 파이프라인의 네 가지 단계를 조합합니다.

  • $unwind: 배열의 각 요소를 개별 문서로 분해합니다.
  • $sort: 지정한 필드를 기준으로 정렬합니다.
  • $group: 원래 문서의 _id를 기준으로 요소들을 다시 묶습니다.
  • $project: 결과를 원래의 필드 구조로 복원합니다.

Case 1: 오름차순 정렬

EmployeeZipCode를 기준으로 오름차순(1) 정렬하는 쿼리는 다음과 같습니다.

> db.sortInnerArrayDemo.aggregate(
... {$unwind: '$EmployeeDetails.EmployeeAddress.EmployeeCountry'},
... {$sort: {'EmployeeDetails.EmployeeAddress.EmployeeCountry.EmployeeZipCode': 1}},
... {$group: {_id: '$_id', 'EmpCountry': {$push:
'$EmployeeDetails.EmployeeAddress.EmployeeCountry'}}},
... {$project: {'EmployeeDetails.EmployeeAddress.EmployeeCountry':
'$EmpCountry'}}).pretty();

실행 결과, EmployeeZipCode 기준으로 내부 배열이 1001 → 1002 → 1003 순서로 오름차순 정렬된 것을 확인할 수 있습니다.

{
    "_id" : ObjectId("5c6f07d3da34711ecf87a5b8"),
    "EmployeeDetails" : {
        "EmployeeAddress" : {
            "EmployeeCountry" : [
                {
                   "EmployeeZipCode" : 1001,
                   "EmployeeStreetName" : "7390 Gonzales Drive"
                },
                {
                   "EmployeeZipCode" : 1002,
                   "EmployeeStreetName" : "444 N.Myres Rd."
                },
                {
                   "EmployeeZipCode" : 1003,
                   "EmployeeStreetName" : "7885 Trusel Street"
                }
            ]
        }
    }
}

Case 2: 내림차순 정렬

정렬 값을 -1로 변경하면 내림차순 정렬이 됩니다. 쿼리는 다음과 같습니다.

> db.sortInnerArrayDemo.aggregate(
... {$unwind: '$EmployeeDetails.EmployeeAddress.EmployeeCountry'},
... {$sort: {'EmployeeDetails.EmployeeAddress.EmployeeCountry.EmployeeZipCode':-1}},
... {$group: {_id: '$_id', 'EmpCountry': {$push:
'$EmployeeDetails.EmployeeAddress.EmployeeCountry'}}},
... {$project: {'EmployeeDetails.EmployeeAddress.EmployeeCountry':
'$EmpCountry'}}).pretty();

실행 결과, EmployeeZipCode 기준으로 내부 배열이 1003 → 1002 → 1001 순서로 내림차순 정렬됩니다.

{
    "_id" : ObjectId("5c6f07d3da34711ecf87a5b8"),
    "EmployeeDetails" : {
        "EmployeeAddress" : {
            "EmployeeCountry" : [
                {
                   "EmployeeZipCode" : 1003,
                   "EmployeeStreetName" : "7885 Trusel Street"
                },
                {
                   "EmployeeZipCode" : 1002,
                   "EmployeeStreetName" : "444 N.Myres Rd."
                },
                {
                   "EmployeeZipCode" : 1001,
                   "EmployeeStreetName" : "7390 Gonzales Drive"
                }
            ]
        }
    }
}

마무리

MongoDB는 find()만으로는 문서 내부 배열의 순서를 바꿀 수 없지만, aggregate 파이프라인에서 $unwind → $sort → $group → $project 단계를 조합하면 손쉽게 해결할 수 있습니다. 정렬 방향은 $sort 단계에서 1(오름차순) 또는 -1(내림차순) 값으로 간단히 제어할 수 있으니, 중첩 배열 데이터를 다룰 때 유용하게 활용해 보시기 바랍니다.