HOWTO · MongoDB

MongoDB 중첩 필드 프로젝션

이 안내에서는 점 표기법과 find()로 MongoDB 중첩 필드를 선택하고, $project로 집계 결과의 형태를 구성하며, $unset 집계 단계로 필드를 제거하는 방법을 설명합니다.

이 페이지의 내용

MongoDB 문서에는 사용자 레코드 안의 address 객체처럼 임베디드 문서가 들어갈 수 있습니다. 프로젝션은 쿼리가 반환하는 필드를 제어합니다. 예를 들어 address.city를 선택하면 중첩 구조를 유지한 채 해당 값을 반환합니다. 간단한 쿼리 결과에는 find() 프로젝션을, 집계 파이프라인에서 문서 형태를 구성할 때는 $project를, 파이프라인 결과에서 특정 필드를 제거할 때는 $unset를 사용합니다.

MongoDB의 중첩 필드 프로젝션 이해하기

문서에 name과 address 필드가 있고, address에 street, city, country가 들어 있다고 가정해 보겠습니다. address.city처럼 점 표기법을 사용해 중첩 경로를 지정합니다. 프로젝션은 반환되는 문서를 바꾸지만 저장된 원본 문서는 바꾸지 않습니다. 아래 예제는 모두 이 문서 구조를 사용합니다. find() 프로젝션에서는 명시적으로 제외하지 않는 한 _id가 기본으로 포함됩니다.

점 표기법과 find()로 중첩 필드 선택하기

중첩된 address에서 도시만 반환하려면 해당 점 경로를 포함합니다. 다음 MongoDB 셸 표현식은 구문을 보여 주기 위한 예시이며, 구성된 런타임에서 실행되지는 않습니다:

db.users.find({}, { "address.city": 1, "_id": 0 })

반환되는 형태는 { "address": { "city": "New York" } }입니다. 각 결과에 식별자를 포함하려면 _id: 0을 생략합니다. 다른 필드는 유지하면서 중첩 경로를 제외하려면 { "address.country": 0 }처럼 0을 지정합니다.

포함 프로젝션에서는 일반적으로 포함할 필드와 제외할 필드를 섞을 수 없습니다. 단, _id는 예외이므로 다른 경로를 포함하면서 제외할 수 있습니다. 나머지 필드에는 포함 프로젝션이나 제외 프로젝션 중 하나를 선택하세요.

다음 예제를 실행하세요:

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

document = {"name": "Ava", "address": {"city": "New York", "country": "USA"}}
result = {"address": {"city": document["address"]["city"]}}
print(result)
{'address': {'city': 'New York'}}

이 짧은 Python 예제는 반환되는 중첩 구조를 보여 줍니다. MongoDB에 연결하지는 않습니다. 위 MongoDB 쿼리는 이에 해당하는 점 경로를 사용합니다.

$project 집계 단계로 중첩 필드 형태 구성하기

집계 파이프라인에서 $project는 중첩 경로를 포함하고 원본 경로를 출력 필드에 대응시킬 수 있습니다. 예를 들어 { $project: { _id: 0, city: "$address.city", name: 1 } }는 city를 최상위 필드로 name과 함께 반환합니다. 반면 { $project: { "address.city": 1, _id: 0 } }처럼 경로를 직접 포함하면 address.city의 중첩 구조를 유지합니다. 따라서 파이프라인에 특정 출력 형태가 필요할 때 $project를 사용할 수 있습니다. 표현식으로 출력 값을 계산할 수도 있습니다. 각 표현식이 입력 문서에 실제로 있는 필드를 참조하는지 확인하세요.

$unset 집계 단계로 중첩 필드 제외하기

다른 필드는 유지하면서 하나 이상의 경로를 제거하려면 집계의 $unset 단계를 사용합니다. 예: { $unset: ["address.country"] }. 점 경로를 지정하면 파이프라인 결과에서 해당 중첩 필드가 제거됩니다. $unset는 파이프라인에서 다음 단계로 전달되는 필드를 바꾸며, 문서를 필터링하지는 않습니다. 문서를 필터링하려면 쿼리 조건이나 $match 단계를 사용하세요. 이 단계는 같은 이름을 가진 업데이트 연산자와는 별개의 집계 기능입니다.

쿼리 프로젝션과 집계 중 선택하기

쿼리 결과 문서에서 필드를 포함하거나 제외하기만 하면 된다면 점 표기법과 함께 find()를 사용하세요. 집계에서 경로 이름을 바꾸거나 값을 계산하거나 의도한 출력 형태를 만들어야 한다면 $project를 선택합니다. 파이프라인에서 대부분의 필드는 유지하고 일부만 제거하려면 $unset를 선택하세요. $addFields는 문서의 나머지 부분을 유지하면서 필드를 추가하거나 바꾸므로, 프로젝션을 선택하는 용도로 대신 쓸 수 없습니다. 세 방법 모두 반환 결과에 영향을 주며 저장된 문서는 바꾸지 않습니다.