MongoDB에서 특정 필드만 업데이트하기
MongoDB에서 문서 전체를 교체하지 않고 특정 필드만 수정하고 싶다면 $set 연산자를 사용해야 합니다. $set은 지정한 필드의 값만 변경하고 나머지 필드는 그대로 유지해 주기 때문에, 부분 업데이트(partial update)에 가장 널리 쓰이는 방법입니다.
이 글에서는 실제 예제를 통해 $set 연산자로 특정 필드만 업데이트하는 과정을 단계별로 살펴보겠습니다.
1단계: 샘플 컬렉션 생성 및 문서 삽입
먼저 insertOne() 메서드를 사용하여 demo265 컬렉션에 문서 세 개를 삽입합니다.
> db.demo265.insertOne({"id":101,"Name":"Chris"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e480d781627c0c63e7dbaa4")
}
> db.demo265.insertOne({"id":102,"Name":"Bob"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e480d7d1627c0c63e7dbaa5")
}
> db.demo265.insertOne({"id":103,"Name":"David"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e480d841627c0c63e7dbaa6")
}2단계: find()로 전체 문서 조회
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.demo265.find();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5e480d781627c0c63e7dbaa4"), "id" : 101, "Name" : "Chris" }
{ "_id" : ObjectId("5e480d7d1627c0c63e7dbaa5"), "id" : 102, "Name" : "Bob" }
{ "_id" : ObjectId("5e480d841627c0c63e7dbaa6"), "id" : 103, "Name" : "David" }3단계: $set으로 특정 필드만 업데이트
다음은 Name이 "David"인 문서에서 id 필드만 10004로 변경하는 쿼리입니다.
> db.demo265.update({Name:"David"},{$set:{id:10004}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })실행 결과인 WriteResult를 보면 조건에 일치한 문서가 1개(nMatched: 1)이고, 실제로 수정된 문서도 1개(nModified: 1)임을 알 수 있습니다.
4단계: 업데이트 결과 확인
다시 find() 메서드로 전체 문서를 조회하여 변경 사항을 확인해 보겠습니다.
> db.demo265.find();
출력 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e480d781627c0c63e7dbaa4"), "id" : 101, "Name" : "Chris" }
{ "_id" : ObjectId("5e480d7d1627c0c63e7dbaa5"), "id" : 102, "Name" : "Bob" }
{ "_id" : ObjectId("5e480d841627c0c63e7dbaa6"), "id" : 10004, "Name" : "David" }David 문서의 id 값만 103에서 10004로 변경되었고, Name 필드는 그대로 유지된 것을 확인할 수 있습니다.
핵심 정리
- $set 연산자: 지정한 필드의 값만 변경하며, 나머지 필드는 삭제되거나 영향을 받지 않습니다.
- update() vs replace:
$set없이 업데이트하면 새 문서로 통째로 교체되므로 주의해야 합니다. - 존재하지 않는 필드:
$set으로 지정한 필드가 문서에 없으면 해당 필드가 자동으로 추가됩니다.
참고로 최신 MongoDB 버전에서는 update() 대신 updateOne(), updateMany() 메서드 사용이 권장됩니다. 예를 들어 db.demo265.updateOne({Name:"David"}, {$set:{id:10004}})처럼 작성하면 동일한 결과를 얻을 수 있습니다.