MongoDB에서 배열 내부의 값을 조회할 때는 find() 메서드와 $elemMatch 연산자를 함께 사용합니다. $elemMatch는 배열 요소 중 지정한 조건을 만족하는 문서를 찾아주는 연산자로, 특히 중첩된 배열 구조를 다룰 때 매우 유용합니다.
이 글에서는 실제 예제를 통해 중첩 배열에서 원하는 값을 가져오는 방법을 단계별로 살펴보겠습니다.
1단계: 샘플 컬렉션 생성
먼저 문서가 포함된 컬렉션을 생성합니다. 아래 예제에서는 학생 이름(StudentName)과 학생 세부 정보(StudentDetails)를 담은 두 개의 문서를 삽입합니다. StudentDetails 내부에는 부모 이름, 국가명, 그리고 선호하는 교사(Teacher)와 과목(Subject), 점수(Marks) 정보가 중첩되어 있습니다.
> db.fetchingArrayValuesDemo.insertOne(
... {
... "StudentName": "David",
... "StudentDetails": [
... {
... "FatherName": "Bob",
... "CountryName": "US",
...
... "Favourite": [
... {
... "Teacher": "DAVID",
... "Subject": [
... "MySQL",
... "MongoDB",
... "Java"
... ],
... "Marks": [
... 50,
... 60,
... 65
... ]
... }
... ]
...
... }
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e06fc3425ddae1f53b621fa")
}
> db.fetchingArrayValuesDemo.insertOne(
... {
... "StudentName": "Robert",
... "StudentDetails": [
... {
... "FatherName": "Sam",
... "CountryName": "AUS",
...
... "Favourite": [
... {
... "Teacher": "MIKE",
... "Subject": [
... "Python",
... "C",
... "C++"
... ],
... "Marks": [
... 76,
... 89,
... 91
... ]
... }
... ]
...
... }
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e06fc6825ddae1f53b621fb")
}
2단계: 전체 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 화면에 표시할 수 있습니다.
> db.fetchingArrayValuesDemo.find();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5e06fc3425ddae1f53b621fa"), "StudentName" : "David", "StudentDetails" : [ { "FatherName" : "Bob", "CountryName" : "US", "Favourite" : [ { "Teacher" : "DAVID", "Subject" : [ "MySQL", "MongoDB", "Java" ], "Marks" : [ 50, 60, 65 ] } ] } ] }
{ "_id" : ObjectId("5e06fc6825ddae1f53b621fb"), "StudentName" : "Robert", "StudentDetails" : [ { "FatherName" : "Sam", "CountryName" : "AUS", "Favourite" : [ { "Teacher" : "MIKE", "Subject" : [ "Python", "C", "C++" ], "Marks" : [ 76, 89, 91 ] } ] } ] }3단계: $elemMatch로 배열 값 가져오기
이제 배열 값을 조회하는 핵심 쿼리입니다. Teacher 필드의 값이 "DAVID"인 문서만 찾기 위해 StudentDetails와 Favourite 두 곳에 각각 $elemMatch를 중첩하여 사용합니다.
> db.fetchingArrayValuesDemo.find({
... StudentDetails:{
... $elemMatch: {
... Favourite: {
... $elemMatch: {
... Teacher: "DAVID"
... }
... }
... }
... }
... });위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5e06fc3425ddae1f53b621fa"), "StudentName" : "David", "StudentDetails" : [ { "FatherName" : "Bob", "CountryName" : "US", "Favourite" : [ { "Teacher" : "DAVID", "Subject" : [ "MySQL", "MongoDB", "Java" ], "Marks" : [ 50, 60, 65 ] } ] } ] }정리
$elemMatch를 사용하면 배열 내부의 조건에 맞는 문서만 정확하게 필터링할 수 있습니다. 위 예제처럼 중첩된 배열 구조에서도 $elemMatch를 여러 겹으로 감싸면 원하는 깊이까지 조건을 적용할 수 있습니다. 이는 복잡한 도큐먼트 구조를 다루는 실무 환경에서 자주 활용되는 패턴이므로 꼭 기억해 두시기 바랍니다.