MongoDB 배열 필드에서 요소의 인덱스 찾기
MongoDB에서 배열 필드 내 특정 요소의 위치(인덱스)를 확인해야 할 때가 있습니다. 이럴 때 $indexOfArray 연산자를 사용하면 간단하게 해결할 수 있습니다.
$indexOfArray는 애그리게이션(Aggregation) 파이프라인에서 사용되는 연산자로, 지정한 배열 안에서 주어진 값이 처음 등장하는 인덱스를 반환합니다. 실제 예제를 통해 살펴보겠습니다.
1. 테스트용 컬렉션 생성
먼저 insertOne() 메서드를 사용하여 문서가 담긴 컬렉션을 생성합니다.
> db.getIndexDemo.insertOne({"InstructorName":"Chris","InstructorSubject":["MongoDB","MySQL","Java","C++"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cbd5251de8cc557214c0df8")
}2. 저장된 문서 확인하기
find() 메서드와 pretty()를 함께 사용하면 컬렉션의 모든 문서를 보기 좋게 출력할 수 있습니다.
> db.getIndexDemo.find().pretty();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : ObjectId("5cbd5251de8cc557214c0df8"),
"InstructorName" : "Chris",
"InstructorSubject" : [
"MongoDB",
"MySQL",
"Java",
"C++"
]
}3. $indexOfArray로 요소의 인덱스 조회하기
이제 aggregate() 메서드에 $project 단계와 $indexOfArray 연산자를 조합하여 배열 필드에서 원하는 요소의 인덱스를 구할 수 있습니다.
다음은 "MongoDB"라는 요소의 인덱스를 조회하는 쿼리입니다.
> db.getIndexDemo.aggregate( [ { "$project": { "matchedIndex": { "$indexOfArray": [ "$InstructorSubject", "MongoDB" ] } } } ] );실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5cbd5251de8cc557214c0df8"), "matchedIndex" : 0 }"MongoDB"는 배열의 첫 번째 요소이므로 인덱스 0이 반환되었습니다.
이번에는 다른 요소인 "C++"의 인덱스를 조회해 보겠습니다.
> db.getIndexDemo.aggregate( [ { "$project": { "matchedIndex": { "$indexOfArray": [ "$InstructorSubject", "C++" ] } } } ] );실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5cbd5251de8cc557214c0df8"), "matchedIndex" : 3 }"C++"는 배열의 네 번째 요소이므로 인덱스 3이 반환되었습니다.
참고 사항
대부분의 프로그래밍 언어와 마찬가지로 MongoDB의 배열 인덱스도 0부터 시작합니다. 따라서 배열의 첫 번째 요소는 인덱스 0을 가지며, 마지막 요소는 n-1(n은 배열의 전체 요소 개수)의 인덱스를 가집니다.
또한 $indexOfArray는 요소를 찾지 못한 경우 -1을 반환하고, 선택적으로 검색 시작 위치와 종료 위치를 추가 인자로 지정할 수 있으니 상황에 맞게 활용하시기 바랍니다.