AI 에이전트의 경우: 문서 인덱스는 https://www.mongodb.com/ko-kr/docs/llms.txt에서 사용할 수 있으며, 모든 페이지의 마크다운 버전은 어떤 URL 경로에 .md를 추가하여 사용할 수 있습니다.
Docs Menu

$ 프로젝트 (집계 단계)

$project

요청된 필드가 있는 문서를 파이프라인의 다음 단계로 전달합니다. 지정된 필드는 입력 문서의 기존 필드일 수도 있고 새로 계산된 필드일 수도 있습니다.

다음 환경에서 호스팅되는 배포에 $project 사용할 수 있습니다.

  • MongoDB Atlas: cloud 에서의 MongoDB 배포를 위한 완전 managed 서비스

$project 단계의 프로토타입 형식은 다음과 같습니다.

{ $project: { <specification(s)> } }

$project는 필드 포함, _id 필드 표시 안 함, 새 필드 추가 및 기존 필드 값 재설정을 지정할 수 있는 문서 사용합니다. 또는 필드 제외를 지정할 수도 있습니다.

$project 사양의 형식은 다음과 같습니다.

형식
설명

<field>: <1 or true>

필드 포함 여부를 지정합니다. 0이 아닌 정수도 true로 처리됩니다.

_id: <0 or false>

_id 필드의 억제를 지정합니다.

필드 조건부로 제외하려면 REMOVE 변수를 대신 사용하세요.자세한 내용은 조건부로 필드 제외를 참조하세요.

<field>: <expression>

새 필드를 추가하거나 기존 필드의 값을 재설정합니다.

표현식 $$REMOVE로 평가되면 해당 필드 출력에서 제외됩니다. 자세한 내용은 조건부로 필드 제외를 참조하세요.

<field>: <0 or false>

필드 제외 여부를 지정합니다.

필드 조건부로 제외하려면 REMOVE 변수를 대신 사용하세요.자세한 내용은 조건부로 필드 제외를 참조하세요.

_id 이외의 필드 제외하도록 지정하면 다른 $project 사양 양식을 사용할 수 없습니다. 이 제한은 REMOVE 변수를 사용하여 필드 조건부로 제외하는 경우에는 적용 되지 않습니다.

필드를 제외하려면 $unset 단계를 사용할 수도 있습니다.

기본값 으로 _id 필드 출력 문서에 포함됩니다. 출력 문서에서 _id 필드 제외하려면 $project에서 _id 필드 사용하지 않음을 명시적으로 지정해야 합니다.

필드 제외를 지정하면 다른 모든 필드가 출력 문서에 반환됩니다.

{ $project: { "<field1>": 0, "<field2>": 0, ... } } // Return all but the specified fields

_id 이외의 필드 제외하도록 지정하면 다른 $project 사양 양식을 사용할 수 없습니다. 즉, 필드를 제외하면 필드 포함을 지정하거나 기존 필드의 값을 재설정하거나 새 필드를 추가할 수 없습니다. 필드. 이 제한은 REMOVE 변수를 사용하여 필드 조건부로 제외하는 경우에는 적용 되지 않습니다.

필드를 제외하려면 $unset 단계도 참조하세요.

집계 표현식에서 변수 REMOVE를 사용하여 조건부로 필드 억제할 수 있습니다. 예시 는 조건부로 필드 제외를 참조하세요.

참고

MongoDB는 문서에 새 필드를 추가할 수 있는 $addFields도 제공합니다.

새 필드를 추가하거나 기존 필드의 값을 재설정하려면 필드 이름을 지정하고 해당 값을 특정 표현식으로 설정합니다. 표현식에 대한 자세한 내용은 표현식을 참조하세요 .

필드 리터럴로 리졸브되는 표현식 으로 설정하는 대신 필드 값을 숫자 또는 부울 리터럴로 직접 설정하다 하려면 $literal 연산자 사용합니다. 그렇지 않으면 $project은 필드 포함하거나 제외할 때 숫자 또는 부울 리터럴을 플래그로 처리합니다.

새 필드를 지정하고 해당 값을 기존 필드의 필드 경로로 설정하면 필드 이름을 효과적으로 변경할 수 있습니다.

$project 단계는 대괄호 []를 사용하여 새 배열 필드를 직접 생성하는 것을 지원합니다. 문서 에 존재하지 않는 배열 필드를 지정하면 작업은 해당 필드 의 값으로 null을(를) 대체합니다. 예시 는 새 배열 필드 프로젝트를 참조하세요.

배열 인덱스 $project 단계와 함께 사용할 수 없습니다.

내장된 문서 내에서 필드를 프로젝션하거나 추가/재설정할 때 다음과 같이 점 표기법을 사용할 수 있습니다.

"contact.address.country": <1 or 0 or expression>

또는 필드를 중첩할 수도 있습니다:

contact: { address: { country: <1 or 0 or expression> } }

필드를 중첩할 때 내장된 문서 내에서 점 표기법을 사용하여 필드를 지정할 수 없습니다(예: contact: { "address.country": <1 or 0 or expression> }은(는) 유효하지 않습니다).

내장된 문서와 이 내장된 문서 내의 필드를 동일한 프로젝션에 모두 지정할 수는 없습니다.

다음 $project 단계는 포함된 contact 문서 와 contact.address.country 필드 모두 프로젝트 하려고 시도하기 때문에 Path collision 오류와 함께 실패합니다.

{ $project: { contact: 1, "contact.address.country": 1 } }

이 오류는 상위 문서 와 포함된 필드 지정된 순서와 관계없이 발생합니다. 다음 $project은(는) 동일한 오류로 인해 실패합니다.

{ $project: { "contact.address.country": 1, contact: 1 } }

$project 단계를 사용하는 경우 이 단계는 일반적으로 파이프라인의 마지막 단계로, 클라이언트에 반환할 필드를 지정하는 데 사용됩니다.

파이프라인 의 시작 또는 중간에 $project 단계를 사용하여 후속 파이프라인 단계로 전달되는 필드 수를 줄이면 데이터베이스 이 최적화를 자동으로 수행하므로 성능이 향상되지 않을 수 있습니다.

MongoDB $project 단계에 빈 문서 전달되면 오류를 반환합니다.

예를 들어 다음 파이프라인을 실행하면 오류가 발생합니다.

db.myCollection.aggregate( [ {
$project: { }
} ] )

배열 인덱스 $project 단계와 함께 사용할 수 없습니다.

이 페이지의 예제에서는 sample_mflix 데이터 세트의 데이터를 사용합니다. 이 데이터 세트를 자체 관리형 MongoDB deployment 에 로드하는 방법에 대한 자세한 내용은 샘플 데이터 세트 로드를 참조하세요. 샘플 데이터베이스를 수정한 경우 이 페이지의 예제를 실행 하려면 데이터베이스를 삭제하고 다시 만들어야 할 수 있습니다.

다음 $project 단계에는 _id, title 및 rated 필드만 포함되어 있습니다.

db.movies.aggregate( [
{ $match: { title: "The Great Train Robbery" } },
{ $project: { title: 1, rated: 1 } },
{ $limit: 1 }
] )
[
{
_id: ObjectId('573a1390f29313caabcd42e8'),
title: 'The Great Train Robbery',
rated: 'TV-G'
}
]

MongoDB 기본값 으로 _id 필드 포함합니다.$project 단계에서 _id 필드 제외하려면 프로젝션 문서 에서 _id 필드 0 로 설정하다 .

다음 $project 단계에서는 _id 필드 제외하지만 title 및 rated 필드는 포함합니다:

db.movies.aggregate( [
{ $match: { title: "The Great Train Robbery" } },
{ $project : { _id: 0, title : 1, rated : 1 } },
{ $limit: 1 }
] )
[ { title: 'The Great Train Robbery', rated: 'TV-G' } ]

다음 $project 단계는 출력에서 rated 필드 제외합니다:

db.movies.aggregate( [
{ $match: { title: "The Great Train Robbery" } },
{ $project : { "rated": 0 } },
{ $limit: 1 }
] )

또는 $unset 단계를 사용하여 필드를 제외합니다.

다음 $project 단계에서는 출력에서 imdb.id 및 type 필드를 제외합니다.

db.movies.aggregate( [
{ $match: { title: "The Great Train Robbery" } },
{ $project: { "imdb.id": 0, "type": 0 } },
{ $limit: 1 }
] )
[
{
_id: ObjectId('573a1390f29313caabcd42e8'),
plot: 'A group of bandits stage a brazen train hold-up, only to find a determined posse hot on their heels.',
genres: [ 'Short', 'Western' ],
runtime: 11,
cast: [
'A.C. Abadie',
"Gilbert M. 'Broncho Billy' Anderson",
'George Barnes',
'Justus D. Barnes'
],
poster: 'https://m.media-amazon.com/images/M/MV5BMTU3NjE5NzYtYTYyNS00MDVmLWIwYjgtMmYwYWIxZDYyNzU2XkEyXkFqcGdeQXVyNzQzNzQxNzI@._V1_SY1000_SX677_AL_.jpg',
title: 'The Great Train Robbery',
fullplot: "Among the earliest existing films in American cinema - notable as the first film that presented a narrative story to tell - it depicts a group of cowboy outlaws who hold up a train and rob the passengers. They are then pursued by a Sheriff's posse. Several scenes have color included - all hand tinted.",
languages: [ 'English' ],
released: ISODate('1903-12-01T00:00:00.000Z'),
directors: [ 'Edwin S. Porter' ],
rated: 'TV-G',
awards: { wins: 1, nominations: 0, text: '1 win.' },
lastupdated: '2015-08-13 00:27:59.177000000',
year: 1903,
imdb: { rating: 7.4, votes: 9847 },
countries: [ 'USA' ],
tomatoes: {
viewer: { rating: 3.7, numReviews: 2559, meter: 75 },
fresh: 6,
critic: { rating: 7.6, numReviews: 6, meter: 100 },
rotten: 0,
lastUpdated: ISODate('2015-08-08T19:16:10.000Z')
},
num_mflix_comments: 0
}
]

또는 문서에 제외 사양을 중첩할 수도 있습니다.

db.movies.aggregate( [
{ $match: { title: "The Great Train Robbery" } },
{ $project: { "imdb": { "id": 0 }, "type" : 0 } },
{ $limit: 1 }
] )
[
{
_id: ObjectId('573a1390f29313caabcd42e8'),
plot: 'A group of bandits stage a brazen train hold-up, only to find a determined posse hot on their heels.',
genres: [ 'Short', 'Western' ],
runtime: 11,
cast: [
'A.C. Abadie',
"Gilbert M. 'Broncho Billy' Anderson",
'George Barnes',
'Justus D. Barnes'
],
poster: 'https://m.media-amazon.com/images/M/MV5BMTU3NjE5NzYtYTYyNS00MDVmLWIwYjgtMmYwYWIxZDYyNzU2XkEyXkFqcGdeQXVyNzQzNzQxNzI@._V1_SY1000_SX677_AL_.jpg',
title: 'The Great Train Robbery',
fullplot: "Among the earliest existing films in American cinema - notable as the first film that presented a narrative story to tell - it depicts a group of cowboy outlaws who hold up a train and rob the passengers. They are then pursued by a Sheriff's posse. Several scenes have color included - all hand tinted.",
languages: [ 'English' ],
released: ISODate('1903-12-01T00:00:00.000Z'),
directors: [ 'Edwin S. Porter' ],
rated: 'TV-G',
awards: { wins: 1, nominations: 0, text: '1 win.' },
lastupdated: '2015-08-13 00:27:59.177000000',
year: 1903,
imdb: { rating: 7.4, votes: 9847 },
countries: [ 'USA' ],
tomatoes: {
viewer: { rating: 3.7, numReviews: 2559, meter: 75 },
fresh: 6,
critic: { rating: 7.6, numReviews: 6, meter: 100 },
rotten: 0,
lastUpdated: ISODate('2015-08-08T19:16:10.000Z')
},
num_mflix_comments: 0
}
]

또는 $unset 단계를 사용하여 필드를 제외합니다.

집계 표현식에서 변수 REMOVE를 사용하여 조건부로 필드를 억제할 수 있습니다.

다음 $project 단계에서는 REMOVE 변수를 사용하여 imdb.votes 필드 null와 같거나 빈 문자열인 경우 이를 제외합니다:

db.movies.aggregate( [
{ $match: { title: "This Is Spinal Tap" } },
{
$project: {
title: 1,
"imdb.rating": 1,
"imdb.id": 1,
"imdb.votes": {
$cond: {
if: { $in: [ "$imdb.votes", [ null, "" ] ] },
then: "$$REMOVE",
else: "$imdb.votes"
}
}
}
},
{ $limit: 1 }
] )
[
{
_id: ObjectId('573a1398f29313caabce94a3'),
title: 'This Is Spinal Tap',
imdb: { rating: 8, id: 88258 }
}
]

이 document 의 경우 imdb.votes 이 빈 string 이므로 MongoDB 해당 필드 출력에서 제외합니다.

팁

$addFields와 비교

$addFields 또는 $project 단계를 사용하여 문서 필드를 제거할 수 있습니다. 파이프라인과 원본 문서를 얼마나 보존할 것인지에 따라 최적의 접근 방식이 달라질 수 있습니다.

$addFields 단계에서 $$REMOVE 사용하는 예시를 보려면 필드 제거를 참조하세요.

movies 컬렉션 의 문서에는 rating, votes 및 id 필드가 있는 내장된 imdb document 포함되어 있습니다. imdb 문서의 rating 필드만 포함하려면 점 표기법사용합니다.

db.movies.aggregate( [
{ $match: { title: "The Great Train Robbery" } },
{ $project: { "imdb.rating": 1 } },
{ $limit: 1 }
] )
[
{
_id: ObjectId('573a1390f29313caabcd42e8'),
imdb: { rating: 7.4 }
}
]

또는 document 에 포함 사양을 중첩합니다.

db.movies.aggregate( [
{ $match: { title: "The Great Train Robbery" } },
{ $project: { imdb: { rating: 1 } } },
{ $limit: 1 }
] )
[
{
_id: ObjectId('573a1390f29313caabcd42e8'),
imdb: { rating: 7.4 }
}
]

다음 $project 단계는 leadActor 및 releaseYear 필드를 추가합니다.

db.movies.aggregate( [
{ $match: { title: "The Great Train Robbery" } },
{
$project: {
title: 1,
leadActor: { $arrayElemAt: [ "$cast", 0 ] },
releaseYear: "$year"
}
},
{ $limit: 1 }
] )
[
{
_id: ObjectId('573a1390f29313caabcd42e8'),
title: 'The Great Train Robbery',
leadActor: 'A.C. Abadie',
releaseYear: 1903
}
]

다음 작업은 year 및 runtime 필드를 새 myArray 필드 의 요소로 프로젝션합니다.

db.movies.aggregate( [
{ $match: { title: "The Great Train Robbery" } },
{ $project: { myArray: [ "$year", "$runtime" ] } },
{ $limit: 1 }
] )
[
{
_id: ObjectId('573a1390f29313caabcd42e8'),
myArray: [ 1903, 11 ]
}
]

배열 사양이 문서에 존재하지 않는 필드를 포함하는 경우 해당 작업은 그 필드의 값으로 null을 대입합니다.

예를 들어 위와 동일한 문서가 주어졌을 때 다음 연산은 year, runtime 필드와 존재하지 않는 필드 $someField를 새 필드 myArray의 요소로 투영합니다.

db.movies.aggregate( [
{ $match: { title: "The Great Train Robbery" } },
{ $project: { myArray: [ "$year", "$runtime", "$someField" ] } },
{ $limit: 1 }
] )
[
{
_id: ObjectId('573a1390f29313caabcd42e8'),
myArray: [ 1903, 11, null ]
}
]

일반적인 집계 작업에 대한 추가 정보와 자세한 설명을 보려면 전체 집계 파이프라인 튜토리얼을 참조하세요.

이 페이지의 메서드에 대해 자세히 알아보려면 다음 가이드를 참조하세요.