MongoDB에서 배열 내 객체의 일부 필드를 필터링하고 원하는 값만 가져오려면 프로젝션(projection)과 함께 $filter 연산자와 $match 단계를 활용하면 됩니다. 이 글에서는 실제 예제를 통해 그 과정을 단계별로 살펴보겠습니다.
1. 샘플 컬렉션 생성하기
먼저 문서가 포함된 컬렉션을 생성합니다.
> db.demo507.insertOne(
... {
... "Information":
... [
... {"Name":"John","SubjectName":"MySQL"},
... {"Name":"Bob","SubjectName":"MongoDB"},
... {"Name":"Chris","SubjectName":"MySQL"},
... {"Name":"David","SubjectName":"C++"}
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e8836d3987b6e0e9d18f577")
}2. find() 메서드로 전체 문서 확인하기
find() 메서드를 사용하면 컬렉션의 모든 문서를 출력할 수 있습니다.
> db.demo507.find().pretty();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : ObjectId("5e8836d3987b6e0e9d18f577"),
"Information" : [
{
"Name" : "John",
"SubjectName" : "MySQL"
},
{
"Name" : "Bob",
"SubjectName" : "MongoDB"
},
{
"Name" : "Chris",
"SubjectName" : "MySQL"
},
{
"Name" : "David",
"SubjectName" : "C++"
}
]
}3. $match와 $filter로 특정 필드 필터링하기
이제 객체 내부의 일부 필드를 필터링하는 집계 쿼리를 살펴보겠습니다. 아래 쿼리는 $match로 SubjectName이 'MySQL'인 문서를 먼저 걸러낸 뒤, $filter로 Information 배열에서 조건에 맞는 요소만 남기고, 마지막으로 두 번째 $project 단계에서 SubjectName 필드만 선택해 반환합니다.
> db.demo507.aggregate([
... {$match: {"Information.SubjectName" : "MySQL" } },
... {$project: {
... _id:0,
... Information: {
... $filter: {
... input: '$Information',
... as: 'result',
... cond: {$eq: ['$$result.SubjectName', 'MySQL']}
... }
... }
... }
... },{$project: {Information: { SubjectName:1}}}
... ]);위 쿼리의 실행 결과는 다음과 같습니다.
{ "Information" : [ { "SubjectName" : "MySQL" }, { "SubjectName" : "MySQL" } ] }핵심 정리
- $match: 조건에 맞는 문서만 걸러내는 파이프라인 단계입니다.
- $filter: 배열 요소 중 cond 조건을 만족하는 항목만 남깁니다.
- $project: _id 제거나 특정 필드(예: SubjectName)만 포함하도록 출력 형태를 제어합니다.
이처럼 세 가지 연산자를 조합하면 MongoDB에서 배열 안의 객체 데이터를 효율적으로 필터링하고 필요한 값만 깔끔하게 추출할 수 있습니다.