$addFields (집계)
정의
$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
와 함께 사용하세요. 예시를 참조하세요.
예시
두 개의 $addFields
단계사용
컬렉션 scores
에는 다음 문서가 포함되어 있습니다.
db.scores.insertMany( [ { _id: 1, student: "Maya", homework: [ 10, 5, 10 ], quiz: [ 10, 8 ], extraCredit: 0 }, { _id: 2, student: "Ryan", homework: [ 5, 6, 5 ], quiz: [ 8, 8 ], extraCredit: 8 } ] )
다음 작업은 두 개의 $addFields
단계를 사용하여 출력 문서에 세 개의 새 필드를 포함합니다.
db.scores.aggregate( [ { $addFields: { totalHomework: { $sum: "$homework" } , totalQuiz: { $sum: "$quiz" } } }, { $addFields: { totalScore: { $add: [ "$totalHomework", "$totalQuiz", "$extraCredit" ] } } } ] )
이 작업은 다음 문서를 반환합니다.
[ { _id: 1, student: "Maya", homework: [ 10, 5, 10 ], quiz: [ 10, 8 ], extraCredit: 0, totalHomework: 25, totalQuiz: 18, totalScore: 43 }, { _id: 2, student: "Ryan", homework: [ 5, 6, 5 ], quiz: [ 8, 8 ], extraCredit: 8, totalHomework: 16, totalQuiz: 16, totalScore: 40 } ]
내장된 문서에 필드 추가
점 표기법을 사용하여 내장된 문서에 새 필드를 추가할 수 있습니다.
그 예로 다음 문서를 사용하여 vehicles
(이)라는 컬렉션을 생성하세요.
db.vehicles.insertMany( [ { _id: 1, type: "car", specs: { doors: 4, wheels: 4 } }, { _id: 2, type: "motorcycle", specs: { doors: 0, wheels: 2 } }, { _id: 3, type: "jet ski" } ] )
다음 집계 작업은 내장된 문서 specs
에 새 필드 fuel_type
를 추가합니다.
db.vehicles.aggregate( [ { $addFields: { "specs.fuel_type": "unleaded" } } ] )
이 연산은 다음과 같은 결과를 반환합니다.
[ { _id: 1, type: "car", specs: { doors: 4, wheels: 4, fuel_type: "unleaded" } }, { _id: 2, type: "motorcycle", specs: { doors: 0, wheels: 2, fuel_type: "unleaded" } }, { _id: 3, type: "jet ski", specs: { fuel_type: "unleaded" } } ]
기존 필드 덮어쓰기
$addFields
연산에서 기존 필드 이름을 지정하면 원래의 필드가 대체됩니다.
animals
컬렉션에는 다음 문서가 포함되어 있습니다.
db.animals.insertOne( { _id: 1, dogs: 10, cats: 15 } )
다음 $addFields
연산은 cats
필드를 지정합니다.
db.animals.aggregate( [ { $addFields: { cats: 20 } } ] )
연산은 다음 문서를 반환합니다.
[ { _id: 1, dogs: 10, cats: 20 } ]
한 필드를 다른 필드로 바꿀 수 있습니다. 다음 예시에서는 item
필드가 _id
필드를 대체합니다.
컬렉션 fruit
에는 다음 문서가 포함되어 있습니다.
db.fruit.insertMany( [ { _id: 1, item: "tangerine", type: "citrus" }, { _id: 2, item: "lemon", type: "citrus" }, { _id: 3, item: "grapefruit", type: "citrus" } ] )
다음 집계 작업에서는 $addFields
를 사용하여 각 문서의 _id
필드를 item
필드의 값으로 바꾸고, item
필드를 정적 값으로 바꿉니다.
db.fruit.aggregate( [ { $addFields: { _id : "$item", item: "fruit" } } ] )
이 연산은 다음을 반환합니다:
[ { _id: "tangerine", item: "fruit", type: "citrus" }, { _id: "lemon", item: "fruit", type: "citrus" }, { _id: "grapefruit", item: "fruit", type: "citrus" } ]
배열에 요소 추가
다음을 사용하여 샘플 scores
컬렉션을 만듭니다:
db.scores.insertMany( [ { _id: 1, student: "Maya", homework: [ 10, 5, 10 ], quiz: [ 10, 8 ], extraCredit: 0 }, { _id: 2, student: "Ryan", homework: [ 5, 6, 5 ], quiz: [ 8, 8 ], extraCredit: 8 } ] )
$addFields
를 $concatArrays
표현식과 함께 사용하여 기존 배열 필드에 요소를 추가할 수 있습니다. 예를 들어, 다음 작업은 $addFields
를 사용하여 homework
필드를 현재 homework
배열과 새 점수 [ 7 ]
이 포함된 다른 배열이 연결된 새 배열의 요소로 바꾸는 것입니다.
db.scores.aggregate( [ { $match: { _id: 1 } }, { $addFields: { homework: { $concatArrays: [ "$homework", [ 7 ] ] } } } ] )
이 연산은 다음을 반환합니다:
[ { _id: 1, student: "Maya", homework: [ 10, 5, 10, 7 ], quiz: [ 10, 8 ], extraCredit: 0 } ]
removeFields
$addFields
변수를 $$REMOVE
변수와 함께 사용하여 문서 필드를 제거할 수 있습니다.
예를 들어 labReadings
컬렉션을 만듭니다.
db.labReadings.insertMany( [ { date: ISODate("2024-10-09"), temperature: 80 }, { date: null, temperature: 83 }, { date: ISODate("2024-12-09"), temperature: 85 } ] )
labReadings
문서에서 date
필드를 제거 하려면 $addFields
를 $$REMOVE
변수와 함께 사용합니다.
db.labReadings.aggregate( [ { $addFields: { date: "$$REMOVE" } } ] )
출력:
[ { _id: ObjectId('671285306fd2c3b24f2e7eaa'), temperature: 80 }, { _id: ObjectId('671285306fd2c3b24f2e7eab'), temperature: 83 }, { _id: ObjectId('671285306fd2c3b24f2e7eac'), temperature: 85 } ]
$$REMOVE
를 사용하여 필드를 조건부로 제거할 수도 있습니다. 예를 들어, 다음 집계는 date
가 null
인 문서에서 date
필드를 제거합니다.
db.labReadings.aggregate( [ { $addFields: { date: { $ifNull: [ "$date", "$$REMOVE" ] } } } ] )
출력:
[ { _id: ObjectId('671285306fd2c3b24f2e7eaa'), date: ISODate('2024-10-09T00:00:00.000Z'), temperature: 80 }, { _id: ObjectId('671285306fd2c3b24f2e7eab'), temperature: 83 }, { _id: ObjectId('671285306fd2c3b24f2e7eac'), date: ISODate('2024-12-09T00:00:00.000Z'), temperature: 85 } ]
팁
$project와 비교
$addFields
또는 $project
단계를 사용하여 문서 필드를 제거할 수 있습니다. 파이프라인과 원본 문서를 얼마나 보존할 것인지에 따라 최적의 접근 방식이 달라질 수 있습니다.
$project
단계에서 $$REMOVE
를 사용하는 예시는 조건부로 필드 제외를 참조하세요.