MongoDB에서 간단한 쿼리로 문서 필터링하기
MongoDB에서 특정 조건에 맞는 문서만 골라내고 싶다면 $match 연산자를 사용하면 됩니다. $match는 애그리게이션(집계) 파이프라인에서 지정한 조건과 일치하는 문서만 다음 단계로 전달하는 역할을 합니다.
이번 글에서는 실제 예제를 통해 컬렉션 생성부터 문서 필터링까지 전 과정을 살펴보겠습니다.
1. 컬렉션 생성 및 문서 삽입
먼저 insertOne() 메서드를 사용해 demo629 컬렉션에 문서를 생성합니다. 이 문서에는 과목 목록(Subject)과 학생별 세부 정보(details)가 배열 형태로 포함되어 있습니다.
> db.demo629.insertOne(
... {
... "Subject": [
... "MySQL",
... "MongoDB"
... ],
... "details": [
... {
... Name:"Chris",
... "Marks":78
... },
... { Name:"David",
... "Marks":89
... }
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e9ae9f56c954c74be91e6b9")
}2. find() 메서드로 전체 문서 조회
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.demo629.find();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5e9ae9f56c954c74be91e6b9"), "Subject" : [ "MySQL", "MongoDB" ], "details" : [ { "Name" : "Chris", "Marks" : 78 }, { "Name" : "David", "Marks" : 89 } ] }3. 간단한 쿼리로 문서 필터링하기
이제 aggregate() 메서드와 함께 $unwind, $match, $project를 조합하여 원하는 문서만 추출해 보겠습니다.
- $unwind: details 배열의 각 요소를 개별 문서로 분해합니다.
- $match: 이름이 'Chris'이면서 Subject가 Java, MySQL, Python, C, C++ 중 하나에 해당하는 문서만 필터링합니다.
- $project: details 필드만 출력하고 _id는 제외합니다.
> db.demo629.aggregate([
... {"$unwind": "$details"},
... {"$match": {"details.Name": 'Chris', "Subject": {"$in":["Java","MySQL","Python","C","C++"]}}},
... {"$project": {"details": 1, "_id": 0}}
... ]);쿼리 실행 결과, 조건에 일치하는 Chris의 정보만 정확히 출력되는 것을 확인할 수 있습니다.
{ "details" : { "Name" : "Chris", "Marks" : 78 } }정리
이처럼 MongoDB에서는 $match를 활용해 간단한 쿼리만으로도 원하는 조건의 문서를 손쉽게 필터링할 수 있습니다. 배열 필드를 다룰 때는 $unwind로 먼저 분해한 뒤 $match로 조건을 걸고, $project로 필요한 필드만 선택하면 깔끔한 결과를 얻을 수 있습니다.