MongoDB에서 특정 조건에 맞는 문서만 선택적으로 수정하려면 update() 메서드를 사용하면 됩니다. 이 글에서는 실제 예제를 통해 조건부 업데이트를 수행하는 과정을 단계별로 살펴보겠습니다.
1단계: 샘플 컬렉션 생성
먼저 insertOne() 메서드를 사용하여 문서가 포함된 컬렉션을 생성합니다.
> db.demo402.insertOne({id:101,"Name":"Chris"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e61214efac4d418a0178585")
}
> db.demo402.insertOne({id:102,"Name":"David"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e612150fac4d418a0178586")
}
> db.demo402.insertOne({id:103,"Name":"Mike"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e612152fac4d418a0178587")
}2단계: 저장된 문서 확인
find() 메서드를 사용하여 컬렉션의 모든 문서를 조회합니다.
> db.demo402.find();
위 명령을 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5e61214efac4d418a0178585"), "id" : 101, "Name" : "Chris" }
{ "_id" : ObjectId("5e612150fac4d418a0178586"), "id" : 102, "Name" : "David" }
{ "_id" : ObjectId("5e612152fac4d418a0178587"), "id" : 103, "Name" : "Mike" }3단계: 조건부 업데이트 실행
다음은 id가 102인 문서의 Name 필드 값을 "Robert"로 변경하는 조건부 업데이트 쿼리입니다.
> db.demo402.update({id:102},
... {
... $set: { Name: "Robert" }
... },
... {upsert: true }
... )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })여기서 $set 연산자는 지정한 필드의 값만 변경하고 나머지 문서 구조는 그대로 유지해 줍니다. 만약 $set 없이 업데이트하면 기존 문서 전체가 새 문서로 덮어써지므로 주의해야 합니다.
또한 upsert: true 옵션은 조건에 일치하는 문서가 없을 경우 해당 내용으로 새 문서를 자동으로 삽입하는 기능입니다. 일치하는 문서가 있으면 정상적으로 수정됩니다.
업데이트 결과 확인
다시 find() 메서드로 전체 문서를 조회해 보겠습니다.
> db.demo402.find();
실행 결과, id가 102인 문서의 Name 값이 "David"에서 "Robert"로 변경된 것을 확인할 수 있습니다.
{ "_id" : ObjectId("5e61214efac4d418a0178585"), "id" : 101, "Name" : "Chris" }
{ "_id" : ObjectId("5e612150fac4d418a0178586"), "id" : 102, "Name" : "Robert" }
{ "_id" : ObjectId("5e612152fac4d418a0178587"), "id" : 103, "Name" : "Mike" }참고: 최신 MongoDB 버전에서는?
MongoDB 3.2 이상 버전에서는 update() 대신 updateOne()(조건에 일치하는 첫 번째 문서만 수정) 또는 updateMany()(일치하는 모든 문서 수정) 메서드 사용이 권장됩니다. 인자 구성은 동일하게 첫 번째에 조건(필터), 두 번째에 업데이트 내용, 세 번째에 옵션을 전달하면 되므로 기존 쿼리를 손쉽게 마이그레이션할 수 있습니다.