MongoDB에서 forEach() 메서드를 사용해 문서를 순회하면, 특정 조건에 맞는 문서를 찾아 해당 문서만 선택적으로 업데이트할 수 있습니다. 이 글에서는 학생 이름이 "David"인 문서를 찾아 그 학생의 점수(Marks)를 새로운 값으로 변경하는 방법을 단계별로 살펴보겠습니다.
1. 테스트용 컬렉션 생성
먼저 예제로 사용할 컬렉션(demo634)에 문서를 삽입합니다.
> db.demo634.insertOne({Name:"Chris","Marks":76});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e9c0ea66c954c74be91e6c9")
}
> db.demo634.insertOne({Name:"Bob","Marks":67});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e9c0ead6c954c74be91e6ca")
}
> db.demo634.insertOne({Name:"David","Marks":37});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e9c0eb76c954c74be91e6cb")
}
2. 전체 문서 조회하기
find() 메서드를 사용하면 컬렉션의 모든 문서를 확인할 수 있습니다.
> db.demo634.find();
위 명령은 다음과 같은 결과를 출력합니다.
{ "_id" : ObjectId("5e9c0ea66c954c74be91e6c9"), "Name" : "Chris", "Marks" : 76 }
{ "_id" : ObjectId("5e9c0ead6c954c74be91e6ca"), "Name" : "Bob", "Marks" : 67 }
{ "_id" : ObjectId("5e9c0eb76c954c74be91e6cb"), "Name" : "David", "Marks" : 37 }
3. forEach()로 David의 점수 업데이트하기
다음은 학생 이름이 "David"인 문서를 순회하며 찾은 뒤, 해당 문서의 점수(Marks)를 98로 업데이트하는 쿼리입니다.
> db.demo634.find({Name:"David"}).forEach(function(d){ db.demo634.update({_id:d._id},{$set:{Marks:98}}); })
동작 원리를 간단히 설명하면 다음과 같습니다.
find({Name:"David"}): 이름이 "David"인 문서만 필터링합니다.forEach(function(d){...}): 필터링된 각 문서에 대해 콜백 함수를 실행합니다.update({_id:d._id}, {$set:{Marks:98}}): 해당 문서의 고유한_id를 기준으로$set연산자를 사용해 Marks 필드만 98로 변경합니다.
4. 업데이트 결과 확인하기
다시 find() 메서드로 전체 문서를 조회해 보겠습니다.
> db.demo634.find();
실행 결과, David의 점수만 37에서 98로 변경된 것을 확인할 수 있습니다.
{ "_id" : ObjectId("5e9c0ea66c954c74be91e6c9"), "Name" : "Chris", "Marks" : 76 }
{ "_id" : ObjectId("5e9c0ead6c954c74be91e6ca"), "Name" : "Bob", "Marks" : 67 }
{ "_id" : ObjectId("5e9c0eb76c954c74be91e6cb"), "Name" : "David", "Marks" : 98 }
참고: 더 간단한 최신 방법
최신 버전의 MongoDB에서는 db.collection.update() 대신 updateOne() 또는 updateMany() 사용이 권장됩니다. 위와 동일한 작업은 다음 한 줄로 더 간단하게 처리할 수 있습니다.
> db.demo634.updateOne({Name:"David"},{$set:{Marks:98}})
다만 조건에 따라 복잡한 자바스크립트 로직을 적용해야 하는 경우에는 forEach()를 활용한 방식이 여전히 유용합니다.