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

MongoDB 컬렉션을 배열 값 기준으로 정렬하는 방법

MongoDB 컬렉션을 배열 값 기준으로 정렬하는 방법

MongoDB 컬렉션을 배열 내부의 값 기준으로 정렬하려면 aggregate() 메서드에 $sort 연산자를 조합해 사용합니다. 이때 배열의 각 요소를 개별 문서로 펼쳐 주는 $unwind 단계도 함께 활용합니다.

먼저 예제에 사용할 컬렉션을 생성하고 문서를 삽입해 보겠습니다.

> db.demo577.insertOne(
...    {
...       "student": {
...          "details": [
...             {
...                Name:"Chris",
...                Score:45
...             },
...             {
...                Name:"Bob",
...                Score:33
...             },
...             {
...                Name:"David",
...                Score:48
...             }
...          ]
...       }
...    }
...   ;
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e916ff1581e9acd78b427ff")
}

위 명령은 student 객체 안에 details라는 배열을 포함한 문서 하나를 demo577 컬렉션에 저장합니다. details 배열에는 학생의 이름(Name)과 점수(Score)를 담은 세 개의 객체가 들어 있습니다.

find()로 전체 문서 확인하기

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

> db.demo577.find();

이 쿼리는 다음과 같은 결과를 출력합니다.

{ "_id" : ObjectId("5e916ff1581e9acd78b427ff"), "student" : { "details" : [
   { "Name" : "Chris", "Score" : 45 },
   { "Name" : "Bob", "Score" : 33 },
   { "Name" : "David", "Score" : 48 }
] } }

배열 값 기준으로 정렬하는 쿼리

다음은 배열 내부의 Score 값을 기준으로 컬렉션을 정렬하는 집계(aggregation) 쿼리입니다.

> db.demo577.aggregate([
...    {$unwind:"$student"},
...    {$unwind:"$student.details"},
...
...    {$sort:{"student.details.Score":-1}}
 ]);

이 쿼리는 다음과 같은 결과를 출력합니다.

{ "_id" : ObjectId("5e916ff1581e9acd78b427ff"), "student" : { "details" : { "Name" : "David", "Score" : 48 } } }
{ "_id" : ObjectId("5e916ff1581e9acd78b427ff"), "student" : { "details" : { "Name" : "Chris", "Score" : 45 } } }
{ "_id" : ObjectId("5e916ff1581e9acd78b427ff"), "student" : { "details" : { "Name" : "Bob", "Score" : 33 } } }

쿼리 동작 원리

  • $unwind("$student"): student 필드를 개별 문서 단위로 분리합니다.
  • $unwind("$student.details"): details 배열의 각 요소를 독립적인 문서로 펼쳐 줍니다.
  • $sort({"student.details.Score": -1}): Score 값을 기준으로 내림차순(-1) 정렬합니다. 오름차순으로 정렬하려면 1을 지정하면 됩니다.

실행 결과를 보면 점수가 높은 순서대로 David(48점), Chris(45점), Bob(33점)이 출력되는 것을 확인할 수 있습니다. 참고로 $unwind를 거치면 배열이 개별 문서로 분리되어 출력되므로, 원본 문서 구조를 그대로 유지한 상태에서 정렬 결과를 얻고 싶다면 이후 $group 단계를 추가로 활용하는 방법도 고려해 볼 수 있습니다.