MongoDB에서 배열에 포함된 특정 요소만 조회하고 싶다면 aggregate() 메서드를 활용하면 됩니다. 이 글에서는 실제 예제를 통해 배열 안에서 원하는 요소만 골라내는 방법을 단계별로 살펴보겠습니다.
1. 샘플 컬렉션 생성하기
먼저 문서를 담은 컬렉션을 생성합니다. 아래 예제에서는 직원 정보를 details 배열로 저장하는 문서를 만들어 보겠습니다.
> db.demo204.insertOne(
... {
... "_id" : 101,
... "Name" : "Chris",
... "Age" : 23,
... "details" : [
... {
... "id" : "1001",
... "empId" : "John_1001",
... "salary" : "50000",
... "Technology" : "Java"
... },
... {
... "id" : "1002",
... "empId" : "John_1002"
... },
... {
... "id" : "1003",
... "empId" : "John_10003",
... "salary" : "60000",
... "Technology" : "MongoDB"
... }
... ]
... }
...);
{ "acknowledged" : true, "insertedId" : 101 }2. find()로 전체 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.demo204.find();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : 101, "Name" : "Chris", "Age" : 23, "details" : [
{ "id" : "1001", "empId" : "John_1001", "salary" : "50000", "Technology" : "Java" },
{ "id" : "1002", "empId" : "John_1002" },
{ "id" : "1003", "empId" : "John_10003", "salary" : "60000", "Technology" : "MongoDB" }
]
}3. aggregate()로 배열의 특정 요소만 표시하기
이제 배열(details) 안에서 id가 "1001"인 요소만 골라내어 해당 요소의 Technology 값만 출력하는 쿼리를 작성해 보겠습니다.
> db.demo204.aggregate(
... [
... { "$match": { "details.id": "1001" }},
... { "$unwind": "$details" },
... { "$match": { "details.id":"1001" }},
... { "$project": { "Technology": "$details.Technology", "_id":0 }}
... ]
...)실행 결과는 다음과 같습니다.
{ "Technology" : "Java" }쿼리 동작 원리 살펴보기
이 파이프라인이 어떻게 동작하는지 각 단계를 자세히 알아보겠습니다.
- $match (첫 번째): details 배열 안에 id가 "1001"인 요소가 있는 문서만 필터링합니다. 이 단계는 불필요한 문서를 조기에 제거하여 성능을 높여줍니다.
- $unwind: details 배열을 해제하여 각 배열 요소를 개별 문서로 분리합니다. 덕분에 각 요소를 독립적으로 처리할 수 있습니다.
- $match (두 번째): 분리된 문서 중에서 id가 "1001"인 요소만 다시 필터링하여 원하는 배열 요소만 남깁니다.
- $project: 최종 출력에서 Technology 필드만 선택하고 _id는 제외(0)하여 깔끔한 결과를 반환합니다.
이처럼 $match, $unwind, $project 단계를 조합하면 MongoDB 배열에서 원하는 요소의 특정 필드만 손쉽게 추출할 수 있습니다. 배열 데이터가 많은 대용량 컬렉션에서도 첫 번째 $match 단계가 인덱스를 활용하므로 효율적인 조회가 가능합니다.