Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB에서 배열 필드의 특정 요소만 투영(Projection)하는 방법

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를 조합하면 배열 필드 내부의 요소들을 서버 측에서 효율적으로 걸러낼 수 있습니다. 클라이언트로 불필요한 데이터를 전송하지 않아도 되기 때문에 네트워크 트래픽 절감과 성능 최적화 측면에서도 유용한 기법입니다.