MongoDB에서 객체로 이루어진 배열을 검색하려면 aggregate() 메서드와 함께 $unwind 연산자를 사용하면 됩니다. 그리고 특정 조건에 맞는 문서를 필터링할 때는 $match를 활용합니다.
샘플 컬렉션 생성하기
먼저 예제 문서를 포함한 컬렉션을 만들어 보겠습니다.
> db.demo623.insertOne(
... {
... _id:1,
... details:[
... {
... Name:"Chris"
... },
... {
... DueDate:new ISODate("2020-01-10")
... },
... {
... CountryName:"US"
... }
... ]
... }
... );
{ "acknowledged" : true, "insertedId" : 1 }저장된 문서 확인하기
find() 메서드를 사용하면 컬렉션의 모든 문서를 조회할 수 있습니다.
> db.demo623.find().pretty();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : 1,
"details" : [
{
"Name" : "Chris"
},
{
"DueDate" : ISODate("2020-01-10T00:00:00Z")
},
{
"CountryName" : "US"
}
]
}객체 배열 검색 쿼리 작성하기
이제 MongoDB에서 객체 배열을 검색하는 실제 쿼리를 살펴보겠습니다. $unwind로 배열을 개별 문서로 분해한 뒤, $match로 원하는 값을 가진 요소만 걸러내고, $project로 필요한 필드만 추출합니다.
> db.demo623.aggregate({$unwind: "$details"},
... {$match: {"details.Name":"Chris"}},
... {$project: {"details.Name": 1}})쿼리 실행 결과는 다음과 같습니다.
{ "_id" : 1, "details" : { "Name" : "Chris" } }동작 원리 정리
$unwind는 details 배열의 각 요소를 별도의 문서로 펼쳐주는 역할을 합니다. 이후 $match가 Name 값이 "Chris"인 문서만 남기고, 마지막으로 $project가 Name 필드만 화면에 표시하도록 지정합니다. 이 세 단계를 조합하면 객체 배열 안에서도 원하는 데이터를 손쉽게 검색할 수 있습니다.