MongoDB에서 한 속성(필드)의 값을 다른 속성으로 복사하려면 update() 메서드와 $set 연산자를 함께 사용하면 됩니다. 이번 글에서는 실제 예제를 통해 컬렉션을 생성하고, date 필드의 값을 ShippingDate 필드로 복사하는 과정을 단계별로 살펴보겠습니다.
1. 샘플 데이터가 있는 컬렉션 생성하기
먼저 insertOne() 메서드를 사용해 문서를 포함하는 컬렉션을 생성합니다.
> db.demo55.insertOne({"ShippingDate":'","date":new ISODate("2019-01-21")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e2716dfcfb11e5c34d89915")
}
> db.demo55.insertOne({"ShippingDate":'","date":new ISODate("2020-05-12")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e2716ebcfb11e5c34d89916")
}2. 컬렉션의 모든 문서 조회하기
find() 메서드를 사용하면 컬렉션의 모든 문서를 확인할 수 있습니다.
> db.demo55.find();
위 쿼리는 다음과 같은 결과를 출력합니다.
{ "_id" : ObjectId("5e2716dfcfb11e5c34d89915"), "ShippingDate" : "", "date" : ISODate("2019-01-21T00:00:00Z") }
{ "_id" : ObjectId("5e2716ebcfb11e5c34d89916"), "ShippingDate" : "", "date" : ISODate("2020-05-12T00:00:00Z") }현재 두 문서 모두 ShippingDate 필드가 빈 문자열('')로 저장되어 있고, 실제 날짜 값은 date 필드에 들어 있습니다. 이 상태에서 date 값을 ShippingDate로 복사해 보겠습니다.
3. find()와 forEach()로 속성 값 복사하기
아래 쿼리는 find()로 모든 문서를 조회한 뒤, forEach() 함수 안에서 update()와 $set을 사용해 각 문서의 date 필드 값을 ShippingDate 필드로 복사합니다.
> db.demo55.find({}).forEach(function(c){
... db.demo55.update({_id: c._id}, {$set: {ShippingDate:c.date}});
... });동작 방식을 살펴보면, 먼저 각 문서를 순회하면서 해당 문서의 _id로 대상 문서를 찾고, $set 연산자를 이용해 ShippingDate 필드에 c.date 값을 설정합니다. 이렇게 하면 기존 필드의 값을 그대로 유지하면서 새 필드에만 값을 추가할 수 있습니다.
4. 복사 결과 확인하기
업데이트가 완료되면 다시 find() 메서드로 문서를 조회해 결과를 확인합니다.
> db.demo55.find();
다음과 같이 ShippingDate 필드에 date 필드의 값이 성공적으로 복사된 것을 확인할 수 있습니다.
{ "_id" : ObjectId("5e2716dfcfb11e5c34d89915"), "ShippingDate" : ISODate("2019-01-21T00:00:00Z"), "date" : ISODate("2019-01-21T00:00:00Z") }
{ "_id" : ObjectId("5e2716ebcfb11e5c34d89916"), "ShippingDate" : ISODate("2020-05-12T00:00:00Z"), "date" : ISODate("2020-05-12T00:00:00Z") }정리
MongoDB에서 한 필드의 값을 다른 필드로 복사하는 핵심은 find()로 문서를 조회한 뒤 forEach()로 각 문서를 순회하면서 update()와 $set 연산자를 적용하는 것입니다. 참고로 최신 MongoDB 버전에서는 updateMany()나 집계 파이프라인 기반 업데이트를 활용하면 서버 측에서 한 번의 작업으로 더 효율적으로 처리할 수도 있습니다.