MongoDB에서 한 컬렉션 내의 다른 필드(열) 값을 가져와 특정 필드에 동일한 값을 설정하고 싶다면, forEach() 메서드로 문서를 순회하면서 값을 복사하면 됩니다. 이 글에서는 실제 예제를 통해 그 과정을 단계별로 살펴보겠습니다.
1. 샘플 컬렉션 생성
먼저 문서가 포함된 컬렉션을 생성합니다.
> db.demo51.insert({"Name1":"Chris","Name":"David","Age":24});
WriteResult({ "nInserted" : 1 })
> db.demo51.insert({"Name1":"Carol","Name":"Mike","Age":22});
WriteResult({ "nInserted" : 1 })
> db.demo51.insert({"Name1":"Sam","Name":"Bob","Age":26});
WriteResult({ "nInserted" : 1 })2. 현재 문서 확인하기
find() 메서드를 사용해 컬렉션의 모든 문서를 조회합니다.
> db.demo51.find();
위 쿼리는 다음과 같은 결과를 출력합니다.
{ "_id" : ObjectId("5e27108ccfb11e5c34d8990d"), "Name1" : "Chris", "Name" : "David", "Age" : 24 }
{ "_id" : ObjectId("5e27108dcfb11e5c34d8990e"), "Name1" : "Carol", "Name" : "Mike", "Age" : 22 }
{ "_id" : ObjectId("5e27108ecfb11e5c34d8990f"), "Name1" : "Sam", "Name" : "Bob", "Age" : 26 }현재 각 문서의 Name1 필드와 Name 필드는 서로 다른 값을 가지고 있습니다.
3. 다른 필드의 값으로 Name1 필드 업데이트하기
이제 forEach()로 모든 문서를 순회하면서 Name 필드의 값을 Name1 필드에 할당한 뒤 저장하는 쿼리를 실행합니다.
> db.demo51.find().forEach( function (d) {
... d.Name1 = d.Name;
... db.demo51.save(d);
... });이 쿼리는 다음과 같이 동작합니다.
- find(): 컬렉션의 모든 문서를 가져옵니다.
- d.Name1 = d.Name;: 각 문서에서 Name 필드의 값을 Name1 필드에 대입합니다.
- db.demo51.save(d);: 변경된 문서를 다시 저장합니다.
4. 업데이트 결과 확인
업데이트 후 다시 find() 메서드로 모든 문서를 조회해 보겠습니다.
> db.demo51.find();
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e27108ccfb11e5c34d8990d"), "Name1" : "David", "Name" : "David", "Age" : 24 }
{ "_id" : ObjectId("5e27108dcfb11e5c34d8990e"), "Name1" : "Mike", "Name" : "Mike", "Age" : 22 }
{ "_id" : ObjectId("5e27108ecfb11e5c34d8990f"), "Name1" : "Bob", "Name" : "Bob", "Age" : 26 }출력 결과를 보면 모든 문서에서 Name1 필드가 Name 필드와 동일한 값으로 성공적으로 업데이트된 것을 확인할 수 있습니다.
참고: 더 효율적인 대안 — updateMany()
MongoDB 4.2 이상 버전에서는 애그리게이션 파이프라인을 활용한 updateMany()를 사용하면 서버 측에서 한 번의 연산으로 처리할 수 있어 더욱 효율적입니다.
> db.demo51.updateMany(
... {},
... [ { $set: { Name1: "$Name" } } ]
... );이 방식은 클라이언트와 서버 간의 반복적인 통신 없이 일괄 업데이트가 가능하므로, 대량의 데이터를 처리할 때 성능상 큰 이점을 제공합니다.