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 값을 조절하거나 정렬 기준 필드를 변경하여 다양한 형태의 최신 데이터 조회 로직을 구현할 수 있습니다.