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

MongoDB에서 배열을 정렬하는 가장 쉬운 방법 ($sort 활용법)

MongoDB에서 배열 필드를 정렬하는 가장 간단한 방법은 $sort 연산자를 사용하는 것입니다. 이 글에서는 실제 예제를 통해 배열 내부의 요소를 원하는 기준으로 오름차순 또는 내림차순으로 정렬하는 방법을 단계별로 살펴보겠습니다.

1. 샘플 컬렉션 생성

먼저 배열 필드를 포함하는 문서로 컬렉션을 생성해 보겠습니다. 아래 예제에서는 배송 날짜(ShipingDate)와 가격(Price) 정보를 담은 배열을 가진 문서를 삽입합니다.

> db.demo242.insertOne(
...
...   {"details2":
...      [
...        {"ShipingDate":new ISODate("2019-10-11"),"Price":1400},
...        {"ShipingDate":new ISODate("2019-10-01"),"Price":1600 }
...      ]
...   }
...
...);
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e4429229af932883c61ea44")
}

2. 저장된 문서 확인하기

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

> db.demo242.find();

위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.

{
    "_id" : ObjectId("5e4429229af932883c61ea44"), "details2" : [
       { "ShipingDate" : ISODate("2019-10-11T00:00:00Z"), "Price" : 1400 },
       { "ShipingDate" : ISODate("2019-10-01T00:00:00Z"), "Price" : 1600 }
     ] 
}

현재 배열에는 날짜가 순서대로 정렬되어 있지 않습니다. 이제 이 배열을 배송 날짜 기준으로 정렬해 보겠습니다.

3. 배열 정렬 쿼리 실행하기

MongoDB에서 배열을 정렬하려면 집계(Aggregation) 파이프라인에서 $unwind, $sort, $group 세 단계를 조합하여 사용합니다.

  • $unwind: 배열을 개별 문서로 분해합니다.
  • $sort: 분해된 문서를 지정한 필드 기준으로 정렬합니다.
  • $group: 정렬된 요소들을 다시 하나의 배열로 묶어줍니다.
> db.demo242.aggregate([ {$unwind: "$details2"}, {$sort: {"details2.ShipingDate":1}}, {$group: {_id:"$_id", details2: {$push:"$details2.ShipingDate"}}} ]);

쿼리를 실행하면 다음과 같이 배열이 배송 날짜 오름차순(1)으로 정렬된 결과를 확인할 수 있습니다.

{ "_id" : ObjectId("5e4429229af932883c61ea44"), "details2" : [ ISODate("2019-10-01T00:00:00Z"), ISODate("2019-10-11T00:00:00Z") ] }

참고: MongoDB 5.2 이상에서는 $sortArray 사용 가능

MongoDB 5.2부터는 위 과정을 더욱 간단하게 처리할 수 있는 $sortArray 연산자가 도입되었습니다. 별도의 $unwind와 $group 없이 한 번에 배열을 정렬할 수 있으므로, 최신 버전을 사용 중이라면 아래와 같은 방식도 고려해 보세요.

> db.demo242.aggregate([
...   {
...     $project: {
...       details2: {
...         $sortArray: { input: "$details2", sortBy: { ShipingDate: 1 } }
...       }
...     }
...   }
... ]);

이처럼 MongoDB에서는 집계 파이프라인을 활용하면 배열 내부의 데이터도 손쉽게 정렬할 수 있습니다. 버전에 맞는 방법을 선택하여 사용하시기 바랍니다.