MongoDB에서 배열 필드의 특정 요소만 투영하는 방법
배열 필드에 담긴 여러 요소 중에서 조건에 맞는 특정 요소만 골라서 조회하고 싶다면, 집계 파이프라인의 $project 단계와 $filter 연산자를 함께 사용하면 됩니다. 이번 글에서는 실제 예제를 통해 그 과정을 단계별로 살펴보겠습니다.
1단계: 샘플 컬렉션 생성하기
먼저 insertOne() 메서드를 사용해 문서가 포함된 컬렉션을 생성합니다.
> db.demo355.insertOne({"id":101,"details":[{"Name":"Chris",isMarried:1},{"Name":"David",isMarried:0},{"Name":"Mike",isMarried:1}]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e568928f8647eb59e5620c5")
}2단계: find()로 전체 문서 확인하기
find() 메서드를 사용하면 컬렉션의 모든 문서를 화면에 표시할 수 있습니다.
> db.demo355.find().pretty();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : ObjectId("5e568928f8647eb59e5620c5"),
"id" : 101,
"details" : [
{
"Name" : "Chris",
"isMarried" : 1
},
{
"Name" : "David",
"isMarried" : 0
},
{
"Name" : "Mike",
"isMarried" : 1
}
]
}3단계: $project와 $filter로 원하는 요소만 투영하기
이제 배열 필드에서 특정 조건을 만족하는 요소만 투영해 보겠습니다. 아래 쿼리는 details 배열 안에서 isMarried 값이 1인 요소만 필터링하여 반환합니다.
$filter 연산자의 각 옵션은 다음과 같은 역할을 합니다.
- input: 필터링 대상이 되는 배열을 지정합니다 (여기서는 "$details").
- as: 배열의 각 요소를 참조할 변수 이름을 정의합니다 (여기서는 "out").
- cond: 각 요소가 결과에 포함되기 위해 만족해야 할 조건을 지정합니다 ($$out.isMarried가 1과 같은지 검사).
> db.demo355.aggregate([
... {
... $project: {
... details: {
... $filter: {
... input: "$details",
... as: "out",
... cond: { $eq:["$$out.isMarried",1] }
... }
... }
... }
... }
... ])실행 결과 확인하기
쿼리를 실행하면 isMarried 값이 1인 요소만 남은 details 배열이 출력됩니다. David(isMarried: 0)는 조건에 해당하지 않으므로 결과에서 제외된 것을 확인할 수 있습니다.
{
"_id" : ObjectId("5e568928f8647eb59e5620c5"), "details" : [
{ "Name" : "Chris", "isMarried" : 1 },
{ "Name" : "Mike", "isMarried" : 1 }
]
}마무리
이처럼 MongoDB에서는 $project와 $filter를 조합하면 배열 필드 내부의 요소들을 서버 측에서 효율적으로 걸러낼 수 있습니다. 클라이언트로 불필요한 데이터를 전송하지 않아도 되기 때문에 네트워크 트래픽 절감과 성능 최적화 측면에서도 유용한 기법입니다.