MongoDB 문서를 안전하게 업데이트하는 방법
MongoDB에서 특정 필드의 값만 수정하고 싶을 때는 update() 메서드와 함께 $set> 연산자를 사용하면 됩니다. 이 방법을 사용하면 기존 문서 전체가 덮어써지지 않고, 지정한 필드만 변경됩니다.
실제 예제를 통해 확인해 보겠습니다. 먼저 컬렉션을 생성하고 문서를 삽입합니다.
> db.demo401.insertOne(
... {
... "_id" : 1001,
... "Name" : "Chris",
... "SubjectName" : "MongoDB",
... "Score" : 45
... }
... );
{ "acknowledged" : true, "insertedId" : 1001 }삽입된 문서 확인하기
find() 메서드를 사용하여 컬렉션의 모든 문서를 조회할 수 있습니다.
> db.demo401.find();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : 1001, "Name" : "Chris", "SubjectName" : "MongoDB", "Score" : 45 }$set 연산자로 필드 값만 업데이트하기
이제 기존 문서를 덮어쓰지 않고 Score 필드만 89로 변경해 보겠습니다. $set 연산자를 사용한 업데이트 쿼리는 다음과 같습니다.
> db.demo401.update({_id: 1001}, {$set: {Score:89}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })결과에서 nModified : 1은 하나의 문서가 성공적으로 수정되었음을 의미합니다.
업데이트 결과 확인
다시 find() 메서드로 모든 문서를 조회해 봅니다.
> db.demo401.find();
실행 결과는 다음과 같습니다.
{ "_id" : 1001, "Name" : "Chris", "SubjectName" : "MongoDB", "Score" : 89 }출력 결과를 보면 Name, SubjectName 등 다른 필드는 그대로 유지된 상태에서 Score 필드만 45에서 89로 변경된 것을 확인할 수 있습니다.
참고 사항
만약 $set 없이 update()>를 호출하면 두 번째 인수로 전달된 문서가 기존 문서 전체를 대체해 버리므로 주의해야 합니다. 따라서 부분 업데이트를 원한다면 항상 $set 연산자를 사용하는 것이 좋습니다. 또한 최신 MongoDB 버전에서는 updateOne()이나 updateMany() 같은 메서드를 사용하는 것이 권장됩니다.