MongoDB에서 update() 메서드를 사용할 때 주의해야 할 점이 있습니다. 쿼리 조건에 해당하는 필드만 수정하려면 반드시 $set 연산자를 사용해야 합니다. $set을 사용하지 않으면 기존 문서 전체가 새로운 내용으로 덮어써지게 됩니다.
이번 글에서는 예제를 통해 MongoDB에서 특정 필드만 업데이트하고 나머지 데이터는 그대로 유지하는 방법을 알아보겠습니다.
1. 컬렉션 생성 및 문서 삽입
먼저 insertOne() 메서드를 사용하여 컬렉션을 만들고 문서를 삽입합니다.
> db.demo601.insertOne(
... {
... id: 1,
... userDetails: {
... userName: "John",
... userMailId: "John@gmail.com"
... }
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e95ff5ced011c280a0905c7")
}
>
> db.demo601.insertOne( { id: 2, userDetails: { userName: "Carol", userMailId: "Carol@gmail.com" } } );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e95ff71ed011c280a0905c8")
}2. 전체 문서 조회
find() 메서드를 사용하여 컬렉션의 모든 문서를 확인합니다.
> db.demo601.find();
위 쿼리는 다음과 같은 결과를 출력합니다.
{ "_id" : ObjectId("5e95ff5ced011c280a0905c7"), "id" : 1, "userDetails" : { "userName" : "John", "userMailId" : "John@gmail.com" } }
{ "_id" : ObjectId("5e95ff71ed011c280a0905c8"), "id" : 2, "userDetails" : { "userName" : "Carol", "userMailId" : "Carol@gmail.com" } }3. $set 연산자로 필드 업데이트
이제 특정 문서의 이메일 주소를 변경해 보겠습니다. 여기서 핵심은 $set 연산자를 사용하는 것입니다.
> db.demo601.update({_id:ObjectId("5e95ff71ed011c280a0905c8")},{$set:{userMailId:"Carol@yahoo.com"}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })nModified : 1은 하나의 문서가 성공적으로 수정되었음을 의미합니다.
4. 업데이트 결과 확인
다시 find() 메서드로 전체 문서를 조회합니다.
> db.demo601.find();
결과는 다음과 같습니다.
{ "_id" : ObjectId("5e95ff5ced011c280a0905c7"), "id" : 1, "userDetails" :
{ "userName" : "John", "userMailId" : "John@gmail.com" }
}
{ "_id" : ObjectId("5e95ff71ed011c280a0905c8"), "id" : 2, "userDetails" :
{ "userName" : "Carol", "userMailId" : "Carol@gmail.com" }, "userMailId" : "Carol@yahoo.com"
}핵심 정리
위 예제에서 볼 수 있듯이, $set 연산자를 사용하면 지정한 필드(userMailId)만 새 값으로 업데이트되고, userName 등 나머지 필드는 원본 그대로 유지됩니다.
반면 $set 없이 db.collection.update({조건}, {새문서}) 형태로 실행하면 기존 문서가 통째로 교체되어 데이터 손실이 발생할 수 있으므로 각별히 주의해야 합니다. 또한 최신 MongoDB 버전에서는 updateOne(), updateMany() 같은 명확한 메서드 사용이 권장됩니다.