MongoDB에서 배열의 마지막 요소(객체)를 조회하려면 aggregate() 메서드와 함께 $arrayElemAt 연산자를 활용하면 됩니다. 이 글에서는 실제 예제를 통해 배열의 마지막 객체를 쿼리하는 방법을 단계별로 살펴보겠습니다.
1. 샘플 컬렉션 생성하기
먼저 문서가 포함된 컬렉션을 생성합니다. 아래 예제에서는 학생 정보가 담긴 'Details' 배열과 'Details1' 배열을 가진 문서를 삽입합니다.
> db.demo103.insertOne({
"Details" : [
{ "StudentId" : 101, "Details" : "MongoDB" },
{ "StudentId" : 102, "Details" : "MySQL" },
{ "StudentId" : 103, "Details" : "Java" }
],
"Details1" : [ { "StudentId" : 104, "Number" : 3 } ]
});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e2ed2dd9fd5fd66da21446e")
}2. 저장된 문서 확인하기
find() 메서드를 사용하여 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.
> db.demo103.find();
위 명령을 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : ObjectId("5e2ed2dd9fd5fd66da21446e"),
"Details" : [
{ "StudentId" : 101, "Details" : "MongoDB" },
{ "StudentId" : 102, "Details" : "MySQL" },
{ "StudentId" : 103, "Details" : "Java" }
],
"Details1" : [ { "StudentId" : 104, "Number" : 3 } ]
}3. 배열의 마지막 객체 쿼리하기
배열의 마지막 객체를 조회하는 핵심은 $arrayElemAt 연산자입니다. 이 연산자는 인덱스 값으로 음수를 전달하면 배열의 뒤에서부터 요소를 가져옵니다. 즉, -1을 지정하면 배열의 마지막 요소를 반환합니다.
아래는 aggregate() 파이프라인에서 $project 단계로 'Details' 배열의 마지막 객체를 추출한 뒤, $match 단계로 StudentId가 103인 문서만 필터링하는 예제입니다.
> db.demo103.aggregate([
{ $project: {
Details1: 1,
Details: { $arrayElemAt: ["$Details", -1] }
}},
{ $match: { "Details.StudentId": 103 } }
])이 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : ObjectId("5e2ed2dd9fd5fd66da21446e"),
"Details1" : [ { "StudentId" : 104, "Number" : 3 } ],
"Details" : { "StudentId" : 103, "Details" : "Java" }
}정리
MongoDB에서 배열의 마지막 객체를 조회하는 방법을 정리하면 다음과 같습니다.
- aggregate() 파이프라인을 사용해 데이터를 변환하고 필터링합니다.
- $arrayElemAt 연산자에 인덱스 -1을 전달하면 배열의 마지막 요소를 추출할 수 있습니다.
- $match 단계를 추가하여 원하는 조건의 문서만 최종적으로 필터링합니다.
이 방식은 배열 내 특정 위치의 요소를 기준으로 조건 검색이 필요한 경우 매우 유용하게 활용됩니다. 참고로 MongoDB 3.2 이상 버전에서 $arrayElemAt 연산자를 지원하므로, 사용 중인 버전을 확인한 후 적용하시기 바랍니다.