Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB에서 다른 필드의 값을 활용해 필드 업데이트하는 방법

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: StudentFirstNameStudentLastName 사이에 공백을 넣어 하나의 문자열로 연결합니다.
  • $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) 스테이지를 조합하면 다른 필드나 다른 컬렉션의 값을 기반으로 손쉽게 필드를 업데이트할 수 있습니다. 특히 여러 필드를 조합해 새로운 파생 필드를 만들 때 매우 유용하므로, 실무에서도 자주 활용되는 패턴이니 꼭 익혀두시기 바랍니다.