MongoDB에서 배열에 저장된 여러 값 중 특정 위치의 요소만 필요한 경우가 자주 있습니다. 이럴 때 애그리게이션(Aggregation) 프레임워크와 $arrayElemAt 연산자를 사용하면 원하는 요소를 간단하게 추출할 수 있습니다.
1. 예시용 컬렉션 생성하기
개념을 쉽게 이해하기 위해 먼저 문서가 포함된 컬렉션을 생성해 보겠습니다. 아래 쿼리를 실행하면 강사 이름과 기술 과목 배열을 가진 문서가 저장됩니다.
> db.getParticularElement.insertOne({"InstructorName":"Larry","InstructorTechnicalSubject":["Java","C","C++","MongoDB","MySQL","SQL Server"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c7ee027559dd2396bcfbfb1")
}2. 저장된 문서 확인하기
find() 메서드와 pretty() 함수를 함께 사용하면 컬렉션의 모든 문서를 보기 좋은 형태로 출력할 수 있습니다.
> db.getParticularElement.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c7ee027559dd2396bcfbfb1"),
"InstructorName" : "Larry",
"InstructorTechnicalSubject" : [
"Java",
"C",
"C++",
"MongoDB",
"MySQL",
"SQL Server"
]
}3. $arrayElemAt으로 특정 요소 가져오기
이제 애그리게이션 파이프라인의 $project 단계에서 $arrayElemAt 연산자를 사용해 배열의 네 번째 요소(인덱스 3)를 추출해 보겠습니다.
> db.getParticularElement.aggregate([
{
$project:
{
FourthElement: { $arrayElemAt: [ "$InstructorTechnicalSubject", 3] }
}
}
]);실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5c7ee027559dd2396bcfbfb1"), "FourthElement" : "MongoDB" }$arrayElemAt 연산자 핵심 정리
- 0부터 시작하는 인덱스: 첫 번째 요소는 인덱스 0입니다. 따라서 네 번째 요소를 얻으려면 인덱스 3을 지정해야 합니다.
- 음수 인덱스 지원: 음수 값을 사용하면 배열의 끝에서부터 역순으로 계산합니다. 예를 들어
-1은 마지막 요소를 반환합니다. - 범위 초과 시: 지정한 인덱스가 배열 범위를 벗어나면 결과가 반환되지 않습니다.
이처럼 $arrayElemAt 연산자를 활용하면 별도의 복잡한 로직 없이도 MongoDB 배열에서 원하는 위치의 요소를 효율적으로 조회할 수 있습니다.