Docs Menu
Docs Home
/
데이터베이스 매뉴얼
/ / /

$project (집계)

$project

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

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

  • MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스

  • MongoDB Enterprise: MongoDB의 구독 기반 자체 관리 버전

  • MongoDB Community: MongoDB의 소스 사용 가능 무료 자체 관리 버전

$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 필드는 기본적으로 출력 문서에 포함됩니다. 입력 문서의 다른 필드를 출력 문서에 포함하려면 $project에 포함을 명시적으로 지정해야 합니다.

  • 문서에 존재하지 않는 필드의 포함을 지정하면 $project(은)는 해당 필드 포함을 무시하고 해당 필드를 문서에 추가하지 않습니다.

_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 단계와 함께 사용할 수 없습니다. 자세한 내용은 배열 인덱스가 지원되지 않음을 참조하세요.

다음 문서가 포함된 collection을 고려합니다:books

{
"_id" : 1,
title: "abc123",
isbn: "0001122223334",
author: { last: "zzz", first: "aaa" },
copies: 5
}

다음 $project 단계는 출력 문서에 _id, title, author 필드만 포함합니다.

db.books.aggregate( [ { $project : { title : 1 , author : 1 } } ] )

이 연산을 수행하면 다음 문서가 생성됩니다.

{ "_id" : 1, "title" : "abc123", "author" : { "last" : "zzz", "first" : "aaa" } }

_id 필드는 기본적으로 항상 포함됩니다. $project 단계의 출력 문서에서 _id 필드를 제외하려면 프로젝션 문서에서 _id 필드를 0으로 설정하여 제외를 지정합니다.

다음 문서가 포함된 collection을 고려합니다:books

{
"_id" : 1,
title: "abc123",
isbn: "0001122223334",
author: { last: "zzz", first: "aaa" },
copies: 5
}

다음 $project 단계에서는 출력 문서에 _id 필드를 제외하지만 titleauthor 필드를 포함합니다.

db.books.aggregate( [ { $project : { _id: 0, title : 1 , author : 1 } } ] )

이 연산을 수행하면 다음 문서가 생성됩니다.

{ "title" : "abc123", "author" : { "last" : "zzz", "first" : "aaa" } }

다음 문서가 포함된 collection을 고려합니다:books

{
"_id" : 1,
title: "abc123",
isbn: "0001122223334",
author: { last: "zzz", first: "aaa" },
copies: 5,
lastModified: "2016-07-28"
}

다음 $project 단계에서는 출력에서 lastModified 필드를 제외합니다.

db.books.aggregate( [ { $project : { "lastModified": 0 } } ] )

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

다음 문서가 포함된 collection을 고려합니다:books

{
"_id" : 1,
title: "abc123",
isbn: "0001122223334",
author: { last: "zzz", first: "aaa" },
copies: 5,
lastModified: "2016-07-28"
}

다음 $project 단계에서는 출력에서 author.firstlastModified 필드를 제외합니다.

db.books.aggregate( [ { $project : { "author.first" : 0, "lastModified" : 0 } } ] )

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

db.bookmarks.aggregate( [ { $project: { "author": { "first": 0}, "lastModified" : 0 } } ] )

두 사양 모두 동일한 출력이 생성됩니다.

{
"_id" : 1,
"title" : "abc123",
"isbn" : "0001122223334",
"author" : {
"last" : "zzz"
},
"copies" : 5,
}

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

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

다음 문서가 포함된 collection을 고려합니다:books

{
"_id" : 1,
title: "abc123",
isbn: "0001122223334",
author: { last: "zzz", first: "aaa" },
copies: 5,
lastModified: "2016-07-28"
}
{
"_id" : 2,
title: "Baked Goods",
isbn: "9999999999999",
author: { last: "xyz", first: "abc", middle: "" },
copies: 2,
lastModified: "2017-07-21"
}
{
"_id" : 3,
title: "Ice Cream Cakes",
isbn: "8888888888888",
author: { last: "xyz", first: "abc", middle: "mmm" },
copies: 5,
lastModified: "2017-07-22"
}

다음 $project 단계에서는 REMOVE 변수를 사용해 author.middle 필드가 ""와 동일한 경우에만 제외합니다.

db.books.aggregate( [
{
$project: {
title: 1,
"author.first": 1,
"author.last" : 1,
"author.middle": {
$cond: {
if: { $eq: [ "", "$author.middle" ] },
then: "$$REMOVE",
else: "$author.middle"
}
}
}
}
] )

집계 연산을 수행하면 다음과 같은 결과가 출력됩니다.

{ "_id" : 1, "title" : "abc123", "author" : { "last" : "zzz", "first" : "aaa" } }
{ "_id" : 2, "title" : "Baked Goods", "author" : { "last" : "xyz", "first" : "abc" } }
{ "_id" : 3, "title" : "Ice Cream Cakes", "author" : { "last" : "xyz", "first" : "abc", "middle" : "mmm" } }

$addFields와 비교

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

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

다음 문서가 포함된 bookmarks collection을 생각해 보세요.

{ _id: 1, user: "1234", stop: { title: "book1", author: "xyz", page: 32 } }
{ _id: 2, user: "7890", stop: [ { title: "book2", author: "abc", page: 5 }, { title: "book3", author: "ijk", page: 100 } ] }

stop 필드의 내장된 문서에 title 필드만 포함하려면 점 표기법을 사용하면 됩니다.

db.bookmarks.aggregate( [ { $project: { "stop.title": 1 } } ] )

또는 문서에 포함 사양을 중첩할 수 있습니다.

db.bookmarks.aggregate( [ { $project: { stop: { title: 1 } } } ] )

두 사양 모두 다음과 같은 문서가 생성됩니다.

{ "_id" : 1, "stop" : { "title" : "book1" } }
{ "_id" : 2, "stop" : [ { "title" : "book2" }, { "title" : "book3" } ] }

다음 문서가 포함된 collection을 고려합니다:books

{
"_id" : 1,
title: "abc123",
isbn: "0001122223334",
author: { last: "zzz", first: "aaa" },
copies: 5
}

다음 $project 단계에서는 새 필드 isbn, lastNamecopiesSold를 추가합니다.

db.books.aggregate(
[
{
$project: {
title: 1,
isbn: {
prefix: { $substr: [ "$isbn", 0, 3 ] },
group: { $substr: [ "$isbn", 3, 2 ] },
publisher: { $substr: [ "$isbn", 5, 4 ] },
title: { $substr: [ "$isbn", 9, 3 ] },
checkDigit: { $substr: [ "$isbn", 12, 1] }
},
lastName: "$author.last",
copiesSold: "$copies"
}
}
]
)

이 연산을 수행하면 다음 문서가 생성됩니다.

{
"_id" : 1,
"title" : "abc123",
"isbn" : {
"prefix" : "000",
"group" : "11",
"publisher" : "2222",
"title" : "333",
"checkDigit" : "4"
},
"lastName" : "zzz",
"copiesSold" : 5
}

예를 들어 컬렉션에 다음 문서가 포함되어 있다고 가정해 보겠습니다.

{ "_id" : ObjectId("55ad167f320c6be244eb3b95"), "x" : 1, "y" : 1 }

다음 작업은 xy 필드를 새 필드 myArray의 요소로 프로젝트합니다.

db.collection.aggregate( [ { $project: { myArray: [ "$x", "$y" ] } } ] )

연산은 다음 문서를 반환합니다.

{ "_id" : ObjectId("55ad167f320c6be244eb3b95"), "myArray" : [ 1, 1 ] }

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

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

db.collection.aggregate( [ { $project: { myArray: [ "$x", "$y", "$someField" ] } } ] )

연산은 다음 문서를 반환합니다.

{ "_id" : ObjectId("55ad167f320c6be244eb3b95"), "myArray" : [ 1, 1, null ] }

배열 인덱스는 $project 단계와 함께 사용할 수 없습니다. 이 섹션에서 예시를 함께 살펴봅시다.

다음 pizzas 컬렉션을 만듭니다:

db.pizzas.insert( [
{ _id: 0, name: [ 'Pepperoni' ] },
] )

다음 예시는 피자를 반환합니다.

db.pizzas.aggregate( [
{ $project: { x: '$name', _id: 0 } },
] )

예시 출력에서는 피자가 반환됩니다.

[ { x: [ 'Pepperoni' ] } ]

다음 예시는 배열 인덱스($name.0)를 사용해 피자를 반환하려고 시도합니다.

db.pizzas.aggregate( [
{ $project: { x: '$name.0', _id: 0 } },
] )

예시 출력에서는 피자가 반환되지 않습니다:

[ { x: [] } ]

이 페이지의 C# 예제에서는 Atlas 샘플 데이터 세트sample_mflix 데이터베이스 사용합니다. 무료 MongoDB Atlas cluster 생성하고 샘플 데이터 세트를 로드하는 방법을 학습하려면 MongoDB .NET/ C# 드라이버 문서에서 시작하기 를 참조하세요.

다음 MovieImdbData 클래스는 sample_mflix.movies 컬렉션 의 문서를 모델링합니다.

public class Movie
{
public ObjectId Id { get; set; }
public string Title { get; set; }
public List<string> Genres { get; set; }
public List<string> Directors { get; set; }
public List<string> Writers { get; set; }
public string Type { get; set; }
public string Plot { get; set; }
public ImdbData Imdb { get; set; }
public List<string> Cast { get; set; }
}
public class ImdbData
{
public string Id { get; set; }
public int Votes { get; set; }
public float Rating { get; set; }
}

참고

Pascal 케이스를 위한 ConventionPack

이 페이지의 C# 클래스는 속성 이름에 Pascal 표기법을 사용하지만, MongoDB 컬렉션의 필드 이름은 카멜 표기법을 사용합니다. 이 차이를 해결하기 위해 애플리케이션이 시작될 때 다음 코드를 사용하여 ConventionPack 을 등록할 수 있습니다.

var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() };
ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true);

MongoDB .NET/C# 드라이버를 사용하여 $project 단계를 MongoDB 집계 파이프라인에 추가하려면 PipelineDefinition 객체에서 Project() 메서드를 호출하고 ProjectionDefinitionBuilder<TDocument> 객체를 전달하세요. TDocument 클래스는 컬렉션의 문서를 나타냅니다.

다음 섹션에서는 $project 단계의 출력 문서를 사용자 지정할 수 있는 다양한 방법을 보여줍니다.

.NET/C# 드라이버를 사용할 때 특정 필드를 포함하려면 프로젝션 빌더에서 Include() 메서드를 호출하십시오. Include() 호출을 연이어 사용하여 여러 필드를 포함할 수 있습니다.

다음 코드 예제는 _id, plottitle 필드만 포함하는 문서를 생성합니다.

var pipeline = new EmptyPipelineDefinition<Movie> ()
.Project(
Builders<Movie>.Projection
.Include(m => m.Title)
.Include(m => m.Plot)
);
var result = movieCollection.Aggregate(pipeline).FirstOrDefault();

파이프라인이 다음 문서를 반환합니다.

{
"_id" : { "$oid" : "573a1390f29313caabcd42e8" },
"plot" : "A group of bandits stage a brazen train hold-up, only to find a
determined posse hot on their heels.",
"title" : "The Great Train Robbery"
}

.NET/C# 드라이버를 사용할 때 결과 문서에서 필드를 제외하려면 프로젝션 빌더에서 Exclude() 메서드를 호출하세요. 여러 필드를 제외하려면 Exclude() 호출을 연속적으로 연결(chain)해서 사용할 수 있습니다.

다음 코드 예시는 Type 필드를 제외한 문서를 생성합니다.

var pipeline = new EmptyPipelineDefinition<Movie>()
.Project(
Builders<Movie>.Projection
.Exclude(m => m.Type)
);
var result = movieCollection.Aggregate(pipeline).FirstOrDefault();

기본적으로 결과 문서에는 항상 _id 필드가 포함됩니다. 다음 코드 예시는 _id 필드를 제외하고 plottitle 필드를 포함하는 문서를 생성합니다.

var pipeline = new EmptyPipelineDefinition<Movie> ()
.Project(
Builders<Movie>.Projection
.Exclude(m => m.Id)
.Include(m => m.Title)
.Include(m => m.Plot)
);
var result = movieCollection.Aggregate(pipeline).FirstOrDefault();

파이프라인의 결과는 다음과 같은 문서입니다.

{
"plot" : "A group of bandits stage a brazen train hold-up, only to find a
determined posse hot on their heels.",
"title" : "The Great Train Robbery"
}

.NET/C# 드라이버를 사용할 때 임베디드 문서에서 필드를 제외하려면 프로젝션 빌더의 Exclude() 메서드를 호출하고 해당 클래스 속성의 경로를 전달하세요. 여러 필드를 제외하려면 Exclude() 호출을 연속적으로 연결(chain)해서 사용할 수 있습니다.

다음 코드 예시는 imdb.idtype 필드를 제외한 문서를 생성합니다.

var pipeline = new EmptyPipelineDefinition<Movie> ()
.Project(
Builders<Movie>.Projection
.Exclude("Imdb.id")
.Exclude(m => m.Type)
);
var result = movieCollection.Aggregate(pipeline).FirstOrDefault();

파이프라인 실행 결과 다음과 같은 출력이 생성됩니다.

{
"plot" : "A group of bandits stage a brazen train hold-up, only to find a
determined posse hot on their heels.",
"title" : "The Great Train Robbery",
...
"imdb" : { "rating" : 7.4000000000000004, "votes" : 9847 }
}

참고

임베디드 ID 필드에는 문자열 사용

임베디드 문서에서 ID 필드를 프로젝션하려면 필드 이름을 string으로 지정하고 Lambda 표현식은 사용하지 마세요.

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

var stage = new BsonDocument
{
{ "title", 1 },
{ "imdb.id", 1 },
{ "imdb.rating", 1 },
{
"imdb.votes", new BsonDocument("$cond", new BsonDocument
{
{ "if", new BsonDocument("$eq", new BsonArray { "", "$imdb.votes" }) },
{ "then", "$$REMOVE" },
{ "else", "$imdb.votes" }
})
}
};
var pipeline = new EmptyPipelineDefinition<Movie>()
.Project(stage)
.Sample(1);
var result = movieCollection.Aggregate(pipeline).FirstOrDefault();

참고

조건부 제외를 위한 빌더가 없습니다.

이전 예제에서는 .NET/C# 드라이버가 조건부로 필드를 제외하는 빌더를 제공하지 않기 때문에 BsonDocument 객체를 사용합니다. 다른 MongoDB 언어 드라이버가 이 기능을 지원할 수도 있습니다. 자세한 내용은 MongoDB 드라이버 문서를 참조하세요.

샘플링된 문서에 imdb.votes 필드가 포함되어 있으면 파이프라인은 다음과 유사한 문서를 반환합니다.

{
"_id" : { "$oid" : "573a1390f29313caabcd42e8" },
"title" : "The Great Train Robbery",
"imdb" : { "rating" : 7.4000000000000004, "id" : 439, "votes" : 9847 }
}

imdb.votes 필드가 문서에 포함되어 있지 않으면 파이프라인은 다음과 유사한 문서를 반환합니다.

{
"_id" : { "$oid" : "573a1398f29313caabce94a3" },
"title" : "This Is Spinal Tap",
"imdb" : { "rating" : 8.0, "id" : 88258 }
}

.NET/C# 드라이버를 사용할 때 결과 문서에 계산된 필드를 포함하려면, 프로젝션 빌더의 Expression() 메서드를 호출하고 계산된 필드를 포함하는 표현식을 전달하세요. 유형 안전성을 높이기 위해 결과 문서용 모델 클래스를 다음 ProjectedMovie 클래스와 같이 정의할 수 있습니다.

public class ProjectedMovie
{
public ObjectId Id { get; set; }
public string Title { get; set; }
public string LeadActor { get; set; }
public List<string> Crew { get; set; }
}

다음 코드 예시는 여러 계산된 필드가 포함된 문서를 생성합니다.

var pipeline = new EmptyPipelineDefinition<Movie>()
.Project(
Builders<Movie>
.Projection
.Expression(m => new ProjectedMovie
{
Id = m.Id,
Title = m.Title,
LeadActor = m.Cast[0],
})
);
var result = movieCollection.Aggregate(pipeline).FirstOrDefault();

파이프라인의 결과는 다음과 같은 문서입니다.

{
"_id" : { "$oid" : "573a1390f29313caabcd42e8" },
"title" : "The Great Train Robbery",
"leadActor" : "A.C. Abadie",
...
}

.NET/C# 드라이버를 사용할 때 결과 문서에 새 배열 필드를 프로젝션하려면 프로젝션 빌더에서 Expression() 메서드를 호출하고 새 배열 필드를 포함하는 표현식을 전달하세요. 유형 안전성을 높이기 위해 결과 문서용 모델 클래스를 다음 ProjectedMovie 클래스와 같이 정의할 수 있습니다.

public class ProjectedMovie
{
public ObjectId Id { get; set; }
public string Title { get; set; }
public string LeadActor { get; set; }
public List<string> Crew { get; set; }
}

다음 코드 예시는 directorswriters 필드의 값을 포함하는 새 배열 필드 crew가 포함된 문서를 생성합니다.

var pipeline = new EmptyPipelineDefinition<Movie> ()
.Project(
Builders<Movie>
.Projection
.Expression(m => new ProjectedMovie
{
Id = m.Id,
Title = m.Title,
LeadActor = m.Cast[0],
Crew = m.Directors.Concat(m.Writers).ToList()
}
)
)
.Sample(1);
var result = movieCollection.Aggregate(pipeline).FirstOrDefault();

파이프라인은 다음과 유사한 문서를 반환합니다.

{
"_id" : { "$oid" : "573a1395f29313caabce2297" },
"title" : "The Chalk Garden",
"leadActor" : "Deborah Kerr",
"crew" : ["Ronald Neame", "John Michael Hayes (screenplay)", "Enid Bagnold (from the play by)"]
}

배열 사양에 문서 에 존재하지 않는 필드가 포함된 경우 파이프라인 해당 필드 의 값으로 null 을(를) 대체합니다. 예시 들어, 다음 코드 예시 directors 필드, writers 및 존재하지 않는 필드makeupArtistscrew라는 새 필드 의 요소로 프로젝션합니다.

var stage = new BsonDocument
{
{ "crew", new BsonArray { "$directors", "$writers", "$makeupArtists" } }
};
var pipeline = new EmptyPipelineDefinition<Movie>()
.Project(stage)
.Sample(1);
var result = movieCollection.Aggregate(pipeline).FirstOrDefault();

파이프라인은 다음과 유사한 문서를 반환합니다.

{
"_id" : { "$oid" : "573a1399f29313caabced0d9" },
"crew" : [["Bill Kroyer"], ["Jim Cox (screenplay)", "Diana Young (original stories)"], null]
}

참고

빌더 클래스는 누락된 필드를 방지합니다.

앞선 예제에서는 BsonDocument 객체를 사용합니다. 이는 빌더를 사용해 배열에 누락된 필드를 추가하려 하면 .NET/C# 드라이버가 컴파일 타임 오류를 발생시키기 때문입니다. 다른 MongoDB 언어 드라이버가 이 기능을 지원할 수도 있습니다. 자세한 내용은 MongoDB 드라이버 문서를 참조하세요.

이 페이지의 Node.js 예제에서는 sample_mflix Atlas 샘플 데이터 세트의 데이터베이스 사용합니다. 무료 MongoDB Atlas cluster 생성하고 샘플 데이터 세트를 로드하는 방법을 학습 MongoDB Node.js 운전자 설명서에서 시작하기를 참조하세요.

MongoDB Node.js 운전자 사용하여 집계 파이프라인 에 $project 단계를 추가하려면 파이프라인 객체 에서 $project 연산자 사용합니다.

다음 섹션에서는 $project 단계의 출력 문서를 사용자 지정하는 방법을 보여줍니다.

특정 필드를 포함하려면 $project 단계에서 필드 값을 1 로 설정하다 .

다음 예시 _id, plottitle 필드만 포함된 문서를 반환합니다.

const pipeline = [
{
$project: {
title: 1,
plot: 1
}
}
];
const cursor = collection.aggregate(pipeline);
return cursor;

출력 문서는 다음 예시 와 유사합니다.

{
_id: new ObjectId('573a1390f29313caabcd42e8'),
plot: 'A group of bandits stage a brazen train hold-up, only to find a
determined posse hot on their heels.',
title: 'The Great Train Robbery'
}

특정 필드를 제외하려면 $project 단계에서 필드 값을 0 로 설정하다 .

다음 예시 type 필드 제외한 문서를 반환합니다.

const pipeline = [
{
$project: {
type: 0
}
}
];
const cursor = collection.aggregate(pipeline);
return cursor;

기본값 으로 결과 문서에는 항상 _id 필드 포함됩니다. 다음 예시 _id 필드 제외하지만 plottitle 필드는 포함하는 문서를 반환합니다.

const pipeline = [
{
$project: {
_id: 0,
title: 1,
plot: 1
}
}
];
const cursor = collection.aggregate(pipeline);
return cursor;

출력 문서는 다음 예시 와 유사합니다.

{
plot: 'A group of bandits stage a brazen train hold-up, only to find a
determined posse hot on their heels.',
title: 'The Great Train Robbery'
}

내장된 문서 에서 필드 제외하려면 $project 단계에서 필드 경로 의 값을 0 로 설정하다 .

참고

포함된 필드에 문자열 사용

내장된 문서 에서 필드 프로젝트 하려면 필드 경로 문자열로 지정합니다.

다음 예시 imdb.idtype 필드를 제외한 문서를 반환합니다.

const pipeline = [
{
$project: {
"imdb.id": 0,
type: 0
}
}
];
const cursor = collection.aggregate(pipeline);
return cursor;

출력 문서는 다음 예시 와 유사합니다.

{
plot: 'A group of bandits stage a brazen train hold-up, only to find a
determined posse hot on their heels.',
title: 'The Great Train Robbery',
imdb: { rating: 7.4000000000000004, votes: 9847 }
}

조건부로 필드 제외하려면 필드 이름에 변수를 포함하는 조건부 로직을 할당합니다.REMOVE

const pipeline = [
{
$project: {
title: 1,
"imdb.id": 1,
"imdb.rating": 1,
"imdb.votes": {
$cond: {
if: { $eq: ["$imdb.votes", ""] },
then: "$REMOVE",
else: "$imdb.votes"
}
}
}
}
];
const cursor = collection.aggregate(pipeline);
return cursor;

문서 에 imdb.votes 필드 포함된 경우 파이프라인 다음 예시 출력과 유사한 문서를 반환합니다.

{
_id: new ObjectId('573a1390f29313caabcd42e8'),
title: 'The Great Train Robbery',
imdb: { rating : 7.4000000000000004, id: 439, votes: 9847 }
}

문서 imdb.votes 필드 포함되어 있지 않은 경우 파이프라인 다음 예시 출력과 유사한 문서를 반환합니다.

{
_id: new ObjectId('573a1390f29313caabcd42e8'),
title: 'This Is Spinal Tap',
imdb: { rating: 8.0, id: 88258 }
}

결과 문서에 계산된 필드를 포함하려면 결과를 저장하는 필드 에 표현식 할당합니다.

다음 예시 _idtitle 필드를 동일한 이름의 새 필드에 프로젝션하고 새 필드 leadActor를 계산합니다. 그런 다음 이 예시 에서는 다음 필드가 포함된 문서를 반환합니다.

const pipeline = [
{
$project: {
_id: "$_id",
title: "$title",
leadActor: { $arrayElemAt: ["$cast", 0] }
}
}
];
const cursor = collection.aggregate(pipeline);
return cursor;

출력 문서는 다음 예시 와 유사합니다.

{
_id: new ObjectId('573a1390f29313caabcd42e8'),
title: 'The Great Train Robbery',
leadActor: 'A.C. Abadie'
}

결과 문서에서 새 배열 필드를 프로젝트 하려면 배열 저장하는 필드 에 새 배열 필드 계산하는 표현식 할당합니다.

다음 예시 directorswriters 필드의 값을 결합하는 새 배열 필드crew가 포함된 문서를 반환합니다.

const pipeline = [
{
$project: {
_id: "$_id",
title: "$title",
leadActor: { $arrayElemAt: ["$cast", 0] },
crew: { $concatArrays: ["$directors", "$writers"] }
}
}
];
const cursor = collection.aggregate(pipeline);
return cursor;

출력 문서는 다음 예시 와 유사합니다.

{
_id: new ObjectId('573a1395f29313caabce2297'),
title: 'The Chalk Garden',
leadActor: 'Deborah Kerr',
crew: ['Ronald Neame', 'John Michael Hayes (screenplay)', 'Enid Bagnold (from the play by)']
}

배열 사양에 문서 에 없는 필드가 포함된 경우 파이프라인 해당 필드 의 값으로 null 을(를) 대체합니다. 예시 들어, 다음 예시 directors 필드, writers 및 존재하지 않는 필드makeupArtistscrew라는 새 필드 의 요소로 프로젝션합니다.

const pipeline = [
{
$project: {
crew: ["$directors", "$writers", "$makeupArtists"]
}
}
];
const cursor = collection.aggregate(pipeline);
return cursor;

출력 문서는 다음 예시 와 유사합니다.

{
_id: new ObjectId('573a1399f29313caabced0d9'),
crew: [['Bill Kroyer'], ['Jim Cox (screenplay)', 'Diana Young (original stories)'], null]
}

일반적인 집계 작업에 대한 자세한 내용과 자세한 설명은 전체 집계 파이프라인 튜토리얼을 참조하세요.

이 페이지의 메서드에 대해 자세히 학습 다음 가이드를 참조하세요.

돌아가기

$planCacheStats

이 페이지의 내용