정의
$addFields문서에 새 필드를 추가합니다.
$addFields입력 문서의 기존 필드와 새로 추가된 필드를 모두 포함하는 문서를 출력합니다.$addFields단계는 입력 문서의 모든 기존 필드를 명시적으로 지정하고 새 필드를 추가하는$project단계와 동일합니다.참고
$addFields의 별칭인$set스테이지를 사용할 수도 있습니다.
호환성
다음 환경에서 호스팅되는 배포에 $addFields 사용할 수 있습니다.
MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스
MongoDB Enterprise: MongoDB의 구독 기반 자체 관리 버전
MongoDB Community: MongoDB의 소스 사용 가능 무료 자체 관리 버전
구문
이 단계에는 다음 구문이 있습니다.
{ $addFields: { <newField>: <expression>, ... } }
추가할 각 필드의 이름을 지정하고 해당 값을 집계 표현식 또는 빈 객체에 설정하다. 표현식에 대한 자세한 내용은 표현식을 참조하세요.
중요
새 필드의 이름이 기존 필드 이름( _id 포함)과 동일한 경우 $addFields 해당 필드의 기존 값을 지정된 표현식의 값으로 덮어씁니다.
행동
$addFields기존 문서에 새 필드를 추가합니다. 집계 연산에$addFields단계를 1개 이상 포함시킬 수 있습니다.$addFields집계 표현식이나 빈 객체에 값을 설정할 수 있는 객체 포함을 허용합니다. 예를 들어 다음과 같은 중첩 객체가 허용됩니다:{$addFields: { a: { b: { } } } } 내장된 문서(배열의 문서 포함)에 필드를 추가하려면 점 표기법을 사용합니다. 예시를 참조하십시오 .
$addFields를 사용하여 기존 배열 필드에 요소를 추가하려면$concatArrays와 함께 사용하세요. 예시를 참조하세요.
예시
이 페이지의 예제에서는 sample_mflix 샘플 데이터 세트 의 데이터를 사용합니다. 이 데이터 세트를 자체 관리형 MongoDB deployment 에 로드하는 방법에 대한 자세한 내용은 샘플 데이터 세트 로드를 참조하세요. 샘플 데이터베이스를 수정한 경우 이 페이지의 예제를 실행 하려면 데이터베이스를 삭제하고 다시 만들어야 할 수 있습니다.
두 개의 $addFields 단계 사용
다음 작업은 두 개의 $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' ] } ] ...
removeFields
$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를 사용하여 필드를 조건부로 제거할 수도 있습니다. 예를 들어, 다음 집계는 rated가 null인 문서에서 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를 사용하는 예시는 조건부로 필드 제외를 참조하세요.