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

MongoDB의 모든 문서에서 배열의 최신 항목을 찾는 방법

MongoDB에서 배열의 최신 항목 찾기

여러 문서에 저장된 배열에서 최신 항목을 추출하려면 MongoDB의 aggregate() 메서드를 활용하는 것이 가장 효과적입니다. 이 글에서는 예제 컬렉션을 만들고, 집계 파이프라인을 사용해 각 문서의 배열에서 최신 데이터를 조회하는 방법을 단계별로 살펴보겠습니다.

1단계: 컬렉션 생성 및 문서 삽입

먼저 demo179라는 이름의 컬렉션을 생성하고 두 개의 문서를 삽입합니다. 각 문서는 이름(Name)과 과목 정보가 담긴 배열(Details)로 구성되어 있습니다.

> db.demo179.insertOne(
...{
...   "Name":"Chris",
...   "Details": [
...   {
...      "Id":101,
...      "Subject":"MongoDB"
...   },
...   {
...      "Id":102,
...      "Subject":"MySQL"
...   }
...   ]
...}
...);
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e3980299e4f06af551997f9")
}
> db.demo179.insertOne(
...{
...   "Name":"David",
...   "Details": [
...   {
...      "Id":103,
...      "Subject":"Java"
...   },
...   {
...      "Id":104,
...      "Subject":"C"
...   }
...   ]
...}
...);
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e39802a9e4f06af551997fa")
}

2단계: 저장된 문서 확인

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

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

위 명령을 실행하면 다음과 같은 결과가 출력됩니다.

{
   "_id" : ObjectId("5e3980299e4f06af551997f9"),
   "Name" : "Chris",
   "Details" : [
      {
         "Id" : 101,
         "Subject" : "MongoDB"
      },
      {
         "Id" : 102,
         "Subject" : "MySQL"
      }
   ]
}
{
   "_id" : ObjectId("5e39802a9e4f06af551997fa"),
   "Name" : "David",
   "Details" : [
      {
         "Id" : 103,
         "Subject" : "Java"
      },
      {
         "Id" : 104,
         "Subject" : "C"
      }
   ]
}

3단계: 집계 파이프라인으로 최신 항목 조회

다음은 모든 문서의 배열에서 최신 항목을 찾는 쿼리입니다.

> db.demo179.aggregate([
...   { "$unwind": "$Details" },
...   { "$sort": { "Details.Id": -1 }  },
...   { "$limit": 2 },
...   {
...      "$group": {
...         "_id": "$Details.Id",
...         "Name" : { "$first": "$Name" },
...         "Details": { "$push": "$Details" }
...      }
...   },
...   {
...      "$project": {
...         "_id": 0, "Name": 1, "Details": 1
...      }
...   }
...])

이 파이프라인의 각 단계는 다음과 같은 역할을 수행합니다.

  • $unwind: Details 배열의 요소를 개별 문서로 분해합니다.
  • $sort: Details.Id 값을 기준으로 내림차순(-1) 정렬하여 Id가 가장 큰 최신 항목을 앞쪽에 배치합니다.
  • $limit: 정렬된 결과 중 상위 2개의 문서만 가져옵니다.
  • $group: Details.Id를 기준으로 그룹화하고, $first와 $push 연산자를 사용해 필요한 필드를 구성합니다.
  • $project: _id 필드는 제외하고 Name과 Details만 출력되도록 지정합니다.

실행 결과

쿼리를 실행하면 아래와 같이 Id 값이 가장 큰 최신 항목들이 반환됩니다.

{ "Name" : "David", "Details" : [ { "Id" : 103, "Subject" : "Java" } ] }
{ "Name" : "David", "Details" : [ { "Id" : 104, "Subject" : "C" } ] }

이처럼 aggregate() 파이프라인의 $unwind, $sort, $limit, $group 단계를 조합하면 여러 문서에 흩어져 있는 배열 데이터에서도 손쉽게 최신 항목을 추출할 수 있습니다. 실무에서는 $limit 값을 조절하거나 정렬 기준 필드를 변경하여 다양한 형태의 최신 데이터 조회 로직을 구현할 수 있습니다.