MongoDB에서는 aggregate(집계) 함수를 사용하면 한 컬렉션의 필드 값을 참조하여 다른 컬렉션의 필드를 업데이트할 수 있습니다. 이 글에서는 두 개의 컬렉션을 만들고, 하나의 컬렉션 데이터를 기반으로 다른 컬렉션을 업데이트하는 과정을 단계별로 살펴보겠습니다.
예제에 사용할 두 개의 컬렉션
- name 컬렉션
- studentInformation 컬렉션
1. name 컬렉션 생성
먼저 첫 번째 컬렉션인 name을 문서와 함께 생성합니다. 아래 쿼리를 실행하세요:
> db.name.insert({"FirstName":"John","LastName":"Smith"});
WriteResult({ "nInserted" : 1 })find() 메서드를 사용하면 컬렉션의 모든 문서를 확인할 수 있습니다:
> db.name.find().pretty();
실행 결과, name 컬렉션에는 다음과 같은 문서가 저장되어 있습니다:
{
"_id" : ObjectId("5c6c00dd68174aae23f5ef55"),
"FirstName" : "John",
"LastName" : "Smith"
}2. studentInformation 컬렉션 생성
이어서 두 번째 컬렉션인 studentInformation을 생성합니다:
> db.studentInformation.insert({"StudentFirstName":"Carol","StudentLastName":"Taylor"});
WriteResult({ "nInserted" : 1 })마찬가지로 find() 메서드로 저장된 문서를 확인할 수 있습니다:
> db.studentInformation.find().pretty();
실행 결과는 다음과 같습니다:
{
"_id" : ObjectId("5c6c013068174aae23f5ef56"),
"StudentFirstName" : "Carol",
"StudentLastName" : "Taylor"
}3. aggregate로 name 컬렉션 업데이트하기
이제 studentInformation 컬렉션의 값을 활용해 name 컬렉션을 업데이트해 보겠습니다. 핵심은 $addFields 스테이지로 새로운 필드를 추가하고, $out 스테이지로 결과를 지정한 컬렉션에 저장하는 것입니다:
> db.studentInformation.aggregate( [
{"$addFields":{"FullName":{"$concat":["$StudentFirstName"," ","$StudentLastName"]} }},
{"$out":"name"} ] );위 파이프라인의 동작 방식은 다음과 같습니다:
- $concat:
StudentFirstName과StudentLastName사이에 공백을 넣어 하나의 문자열로 연결합니다. - $addFields: 연결된 문자열을
FullName이라는 새 필드로 추가합니다. - $out: 집계 결과 전체를
name컬렉션에 덮어써서 저장합니다.
주의: $out은 대상 컬렉션의 기존 내용을 모두 대체합니다. 즉, 위 예제에서 name 컬렉션의 원래 문서(John Smith)는 삭제되고 집계 결과로 완전히 교체됩니다. 기존 데이터를 유지하면서 일부만 수정하려면 MongoDB 4.2 이상에서 제공하는 $merge 스테이지를 사용하는 것이 좋습니다.
4. 업데이트 결과 확인
업데이트가 정상적으로 완료되었는지 name 컬렉션의 문서를 다시 조회해 보겠습니다:
> db.name.find().pretty();
실행 결과, 필드가 성공적으로 업데이트된 것을 확인할 수 있습니다:
{
"_id" : ObjectId("5c6c013068174aae23f5ef56"),
"StudentFirstName" : "Carol",
"StudentLastName" : "Taylor",
"FullName" : "Carol Taylor"
}마무리
이처럼 MongoDB의 aggregate 파이프라인과 $addFields, $out(또는 $merge) 스테이지를 조합하면 다른 필드나 다른 컬렉션의 값을 기반으로 손쉽게 필드를 업데이트할 수 있습니다. 특히 여러 필드를 조합해 새로운 파생 필드를 만들 때 매우 유용하므로, 실무에서도 자주 활용되는 패턴이니 꼭 익혀두시기 바랍니다.