Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/ /

$addFields (집계 단계)

$addFields

문서에 새 필드를 추가합니다. $addFields 입력 문서의 기존 필드와 새로 추가된 필드를 모두 포함하는 문서를 출력합니다.

$addFields 단계는 입력 문서의 모든 기존 필드를 명시적으로 지정하고 새 필드를 추가하는 $project 단계와 동일합니다.

참고

$addFields의 별칭인 $set 스테이지를 사용할 수도 있습니다.

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

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

이 단계에는 다음 구문이 있습니다.

{ $addFields: { <newField>: <expression>, ... } }

추가할 각 필드의 이름을 지정하고 해당 값을 집계 표현식 또는 빈 객체에 설정하다. 표현식에 대한 자세한 내용은 표현식을 참조하세요.

중요

새 필드의 이름이 기존 필드 이름( _id 포함)과 동일한 경우 $addFields 해당 필드의 기존 값을 지정된 표현식의 값으로 덮어씁니다.

  • $addFields 기존 문서에 새 필드를 추가합니다. 집계 연산에 $addFields 단계를 1개 이상 포함시킬 수 있습니다.

  • $addFields 집계 표현식이나 빈 객체에 값을 설정할 수 있는 객체 포함을 허용합니다. 예를 들어 다음과 같은 중첩 객체가 허용됩니다:

    {$addFields: { a: { b: { } } } }

    내장된 문서(배열의 문서 포함)에 필드를 추가하려면 점 표기법을 사용합니다. 예시를 참조하십시오 .

  • $addFields를 사용하여 기존 배열 필드에 요소를 추가하려면 $concatArrays와 함께 사용하세요. 예시를 참조하세요.

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

다음 작업은 두 개의 $addFields 단계를 사용하여 먼저 런타임을 시간으로 변환한 다음 시간당 $0.50 의 라이선스 요금을 계산합니다.

db.movies.aggregate( [
{ $match: { runtime: { $gt: 1000 } } },
{
$addFields: {
runtimeHours: {
$floor: { $divide: [ "$runtime", 60 ] }
},
ratingOutOf100: { $multiply: [ "$imdb.rating", 10 ] }
}
},
{
$addFields: {
licenseFeeUSD: {
$multiply: [ "$runtimeHours", 0.50 ]
}
}
}
] )
[
{ _id: ..., title: 'Baseball', runtime: 1140, runtimeHours: 19, licenseFeeUSD: 9.5 },
{ _id: ..., title: 'Centennial', runtime: 1256, runtimeHours: 20, licenseFeeUSD: 10 }
]
...

점 표기법을 사용하여 내장된 문서에 새 필드를 추가할 수 있습니다.

다음 집계 작업은 각 영화에 내장된 imdb 문서 에 certified 필드 추가합니다.

db.movies.aggregate( [
{ $match: { runtime: { $gt: 1000 } } },
{ $addFields: { "imdb.certified": true } }
] )
[
{ _id: ..., title: 'Baseball', imdb: { certified: true, '...': '...' } },
{ _id: ..., title: 'Centennial', imdb: { certified: true, '...': '...' } }
]
...

$addFields 연산에서 기존 필드 이름을 지정하면 원래의 필드가 대체됩니다.

다음 $addFields 작업은 runtime 필드 덮어써서 15 분을 추가합니다.

db.movies.aggregate( [
{ $match: { runtime: { $gt: 1000 } } },
{
$addFields: { runtime: { $add: [ "$runtime", 15 ] } }
}
] )
[
{ _id: ..., title: 'Baseball', runtime: 1155 },
{ _id: ..., title: 'Centennial', runtime: 1271 }
]
...

한 필드 다른 필드로 바꿀 수도 있습니다. 다음 작업은 _id 을 영화 제목으로 설정하고 title 필드 영화의 프라이머리 장르로 바꿉니다.

db.movies.aggregate( [
{ $match: { runtime: { $gt: 1000 } } },
{
$addFields: {
_id: "$title",
title: { $arrayElemAt: [ "$genres", 0 ] }
}
}
] )
[
{ _id: 'Baseball', title: 'Documentary' },
{ _id: 'Centennial', title: 'Action' }
]
...

$addFields$concatArrays 표현식과 함께 사용하여 기존 배열 필드에 요소를 추가할 수 있습니다. 다음 작업은 제목이 Centennial인 영화의 genres 배열 에 Epic 를 추가합니다.

db.movies.aggregate( [
{ $match: { title: "Centennial" } },
{ $addFields: {
genres: {
$concatArrays: [ "$genres", [ "Epic" ] ]
}
} }
] )
[
{ _id: ..., title: 'Centennial', genres: [ 'Action', 'Adventure', 'Drama', 'Epic' ] }
]
...

$addFields 변수를 $$REMOVE 변수와 함께 사용하여 문서 필드를 제거할 수 있습니다.

다음 **작업**은 $addFields 을(를) 사용하여 $$REMOVE 변수가 있는 plot **필드**를 **제거**합니다.

db.movies.aggregate( [
{ $match: { runtime: { $gt: 1000 } } },
{
$addFields: { plot: "$$REMOVE" }
}
] )
[
{ _id: ..., title: 'Baseball', runtime: 1140 },
{ _id: ..., title: 'Centennial', runtime: 1256 }
]
...

$$REMOVE를 사용하여 필드를 조건부로 제거할 수도 있습니다. 예를 들어, 다음 집계는 ratednull인 문서에서 rated 필드를 제거합니다.

db.movies.aggregate( [
{ $match: { runtime: { $gt: 1000 } } },
{
$addFields:
{
rated: {
$ifNull: [ "$rated", "$$REMOVE" ]
}
}
}
] )
[
{ _id: ..., title: 'Baseball', rated: 'TV-PG' },
{ _id: ..., title: 'Centennial' }
]
...

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

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

다음 예시 영화의 총 리뷰 수가 포함된 각 영화 문서 에 totalReviews 필드 추가하는 파이프라인 단계를 만듭니다. 그런 다음 이 예시 에서는 집계 파이프라인 실행합니다.

const pipeline = [
{
$addFields: {
totalReviews: {
$add: ["$imdb.votes", "$tomatoes.viewer.numReviews"]
}
}
}
];
const cursor = collection.aggregate(pipeline);
return cursor;

$project와 비교

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

$project 단계에서 $$REMOVE를 사용하는 예시는 조건부로 필드 제외를 참조하세요.

관련 파이프라인 단계에 대해 자세히 학습 $project$set 가이드를 참조하세요.

돌아가기

집계 단계

이 페이지의 내용