Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB에서 배열 안의 배열(중첩 배열) 쿼리하는 방법

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 연산자로 검색 조건을 지정하면 됩니다. 이 방식을 활용하면 중첩 배열 구조의 데이터도 정확하게 필터링할 수 있습니다.