$addFields 연산자 소개
MongoDB의 애그리게이션(Aggregation) 파이프라인에서 $addFields 연산자를 사용하면 기존 필드를 모두 그대로 유지한 상태로 문서에 새로운 필드를 추가할 수 있습니다. 일반적인 $project 단계는 명시적으로 포함하지 않은 필드를 결과에서 제외해 버리지만, $addFields는 기존 구조를 보존하면서 필드만 덧붙이기 때문에 이러한 요구 사항에 가장 적합한 선택입니다.
예제용 컬렉션 생성
개념을 이해하기 위해 먼저 문서 하나가 들어 있는 컬렉션을 생성해 보겠습니다. 다음 쿼리를 실행합니다.
> db.addFieldDemo.insertOne({
"EmployeeId": 101,
"EmployeeName": "Larry",
"EmployeeDetails": {
"EmployeeSalary": 65000,
"EmployeeCity": "New York",
"Message": "Hi"
}
});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c7f654d8d10a061296a3c44")
}
저장된 문서 확인하기
find() 메서드를 사용하면 컬렉션의 모든 문서를 조회할 수 있습니다.
> db.addFieldDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c7f654d8d10a061296a3c44"),
"EmployeeId" : 101,
"EmployeeName" : "Larry",
"EmployeeDetails" : {
"EmployeeSalary" : 65000,
"EmployeeCity" : "New York",
"Message" : "Hi"
}
}
$addFields로 새 필드 추가하기
이제 기존 필드를 모두 포함한 상태에서 새 필드를 추가하는 핵심 쿼리를 살펴보겠습니다. 아래 예제에서는 중첩된 EmployeeDetails.EmployeeSalary 값을 참조하여 최상위 레벨에 EmployeeBasicSalary라는 새 필드로 추가합니다.
> db.addFieldDemo.aggregate([
{ "$addFields": { "EmployeeBasicSalary": "$EmployeeDetails.EmployeeSalary" } }
]).pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c7f654d8d10a061296a3c44"),
"EmployeeId" : 101,
"EmployeeName" : "Larry",
"EmployeeDetails" : {
"EmployeeSalary" : 65000,
"EmployeeCity" : "New York",
"Message" : "Hi"
},
"EmployeeBasicSalary" : 65000
}
결과 분석
출력 결과를 보면 기존의 _id, EmployeeId, EmployeeName, EmployeeDetails 필드가 모두 그대로 유지되었고, 맨 아래에 EmployeeBasicSalary(값: 65000)라는 새 필드가 성공적으로 추가된 것을 확인할 수 있습니다.
알아두면 좋은 팁
$addFields는 MongoDB 3.4 버전부터 도입되었으며, 4.2 버전부터는 동일한 기능을 하는$set이라는 별칭도 제공됩니다.$addFields는 애그리게이션 파이프라인 내에서만 적용되며, 원본 컬렉션의 문서를 영구적으로 변경하지 않습니다. 결과를 저장하려면$out또는$merge단계를 함께 사용해야 합니다.- 추가하려는 필드와 같은 이름의 필드가 이미 존재하는 경우, 기존 값이 새 값으로 덮어써집니다.