MongoDB에서 문서의 특정 필드만 선택적으로 업데이트하려면 update() 메서드를 사용합니다. 이때 새로운 값을 지정하는 역할은 $set 연산자가 담당하며, $set을 사용하면 지정한 필드만 수정되고 나머지 데이터는 그대로 유지됩니다.
1. 샘플 컬렉션 생성하기
먼저 실습에 사용할 컬렉션을 만들고 문서를 삽입해 보겠습니다.
> db.demo352.insertOne({"Name":"Chris"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e55510af8647eb59e5620ba") }
> db.demo352.insertOne({"Name":"David"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e55510ef8647eb59e5620bb") }
> db.demo352.insertOne({"Name":"Bob"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e555112f8647eb59e5620bc") }
> db.demo352.insertOne({"Name":"Mike"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e555115f8647eb59e5620bd") }2. find()로 전체 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.
> db.demo352.find();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5e55510af8647eb59e5620ba"), "Name" : "Chris" }
{ "_id" : ObjectId("5e55510ef8647eb59e5620bb"), "Name" : "David" }
{ "_id" : ObjectId("5e555112f8647eb59e5620bc"), "Name" : "Bob" }
{ "_id" : ObjectId("5e555115f8647eb59e5620bd"), "Name" : "Mike" }3. 특정 필드만 업데이트하는 쿼리
이제 Name이 "David"인 문서의 이름만 "Robert"로 변경해 보겠습니다. 조건으로 업데이트할 문서를 찾고, $set으로 변경할 필드와 값을 지정합니다.
> db.demo352.update({Name:"David"},{$set:{"Name":"Robert"}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })실행 결과에서 nMatched: 1은 조건에 일치한 문서가 1개라는 의미이고, nModified: 1은 실제로 수정된 문서가 1개라는 뜻입니다.
4. 업데이트 결과 확인하기
다시 find() 메서드로 전체 문서를 조회해 보겠습니다.
> db.demo352.find();
결과를 보면 David였던 문서만 Robert로 변경되었고, 나머지 문서는 그대로 유지된 것을 확인할 수 있습니다.
{ "_id" : ObjectId("5e55510af8647eb59e5620ba"), "Name" : "Chris" }
{ "_id" : ObjectId("5e55510ef8647eb59e5620bb"), "Name" : "Robert" }
{ "_id" : ObjectId("5e555112f8647eb59e5620bc"), "Name" : "Bob" }
{ "_id" : ObjectId("5e555115f8647eb59e5620bd"), "Name" : "Mike" }참고: 최신 MongoDB 버전에서는?
MongoDB 4.2 이상 버전에서는 기존의 update() 대신 updateOne() 또는 updateMany() 메서드 사용이 권장됩니다. 예를 들어 위와 동일한 작업은 다음과 같이 작성할 수 있습니다.
> db.demo352.updateOne({Name:"David"},{$set:{"Name":"Robert"}});updateOne()은 조건에 일치하는 첫 번째 문서 하나만 수정하고, updateMany()는 일치하는 모든 문서를 한 번에 수정합니다. 이처럼 $set 연산자를 활용하면 원하는 필드만 정확하게 업데이트할 수 있습니다.