MongoDB에서 배열 안에 배열이 중첩된 구조(배열의 배열)를 쿼리하려면 $in 연산자를 사용합니다. 개념을 쉽게 이해하기 위해 실제 문서를 담은 컬렉션을 만들어 단계별로 살펴보겠습니다.
1. 컬렉션 생성 및 문서 삽입
먼저 insertOne() 메서드를 사용해 컬렉션에 문서를 삽입합니다. 쿼리는 다음과 같습니다.
> db.arrayOfArraysDemo.insertOne({"EmployeeName":"Larry","EmployeeSkills":[["Java","MongoDB","MySQL","SQL Server"]]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c7f7a8d8d10a061296a3c5b")
}
> db.arrayOfArraysDemo.insertOne({"EmployeeName":"Mike","EmployeeSkills":[["C","C++"]]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c7f7aa68d10a061296a3c5c")
}위 예제에서는 직원 이름(EmployeeName)과 기술 목록(EmployeeSkills)을 저장하며, 기술 목록은 배열 안에 또 다른 배열로 중첩되어 있는 구조입니다.
2. 저장된 문서 확인하기
find() 메서드를 사용하면 컬렉션의 모든 문서를 조회할 수 있습니다.
> db.arrayOfArraysDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c7f7a8d8d10a061296a3c5b"),
"EmployeeName" : "Larry",
"EmployeeSkills" : [
[
"Java",
"MongoDB",
"MySQL",
"SQL Server"
]
]
}
{
"_id" : ObjectId("5c7f7aa68d10a061296a3c5c"),
"EmployeeName" : "Mike",
"EmployeeSkills" : [
[
"C",
"C++"
]
]
}3. $elemMatch와 $in으로 중첩 배열 쿼리하기
중첩된 배열 내부의 값을 검색하려면 $elemMatch를 두 번 중첩하여 사용하고, 그 안에서 $in 연산자로 원하는 값을 지정합니다. 쿼리는 다음과 같습니다.
> db.arrayOfArraysDemo.find({'EmployeeSkills':{$elemMatch:{$elemMatch:{$in:['MongoDB']}}}
}).pretty();위 쿼리는 EmployeeSkills 필드의 내부 배열에 'MongoDB'가 포함된 문서만 반환합니다. 실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c7f7a8d8d10a061296a3c5b"),
"EmployeeName" : "Larry",
"EmployeeSkills" : [
[
"Java",
"MongoDB",
"MySQL",
"SQL Server"
]
]
}정리
MongoDB에서 배열 안의 배열을 조회할 때는 $elemMatch를 중첩 깊이만큼 반복해서 사용하고, 마지막 단계에서 $in 연산자로 검색 조건을 지정하면 됩니다. 이 방식을 활용하면 중첩 배열 구조의 데이터도 정확하게 필터링할 수 있습니다.