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

MongoDB에서 중첩 배열을 정렬하는 쿼리 작성 방법

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로 지정하면 됩니다.