Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB findOneAndUpdate() 메서드로 단일 문서 업데이트하는 방법

MongoDB에서 findOneAndUpdate() 메서드는 필터(filter)와 정렬(sort) 조건에 맞는 단일 문서를 업데이트할 때 사용합니다. 이 메서드는 조건에 일치하는 첫 번째 문서를 찾아 수정하고, 기본적으로 수정되기 전의 원본 문서를 반환한다는 특징이 있습니다.

findOneAndUpdate() 기본 문법

db.collection.findOneAndUpdate(filter, update, options)
  • filter: 업데이트할 문서를 찾기 위한 조건
  • update: 적용할 업데이트 연산자(예: $inc, $set 등)
  • options: 선택 사항으로, sort, projection, returnNewDocument 등을 지정할 수 있습니다

예제 컬렉션 생성하기

먼저 실습용 컬렉션을 만들고 문서를 삽입해 보겠습니다.

> db.demo328.insertOne({Name:"Chris",Marks:67});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e516b19f8647eb59e56207a")
}
> db.demo328.insertOne({Name:"David",Marks:78});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e516b24f8647eb59e56207b")
}
> db.demo328.insertOne({Name:"Bob",Marks:97});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e516b2bf8647eb59e56207c")
}

find() 메서드를 사용하여 컬렉션의 모든 문서를 조회합니다.

> db.demo328.find();

위 쿼리는 다음과 같은 결과를 출력합니다.

{ "_id" : ObjectId("5e516b19f8647eb59e56207a"), "Name" : "Chris", "Marks" : 67 }
{ "_id" : ObjectId("5e516b24f8647eb59e56207b"), "Name" : "David", "Marks" : 78 }
{ "_id" : ObjectId("5e516b2bf8647eb59e56207c"), "Name" : "Bob", "Marks" : 97 }

findOneAndUpdate()로 필드 값 증가시키기

이제 findOneAndUpdate()를 사용하여 특정 문서의 Marks 필드 값을 10만큼 증가시켜 보겠습니다. 여기서는 $inc 연산자를 활용합니다.

> db.demo328.findOneAndUpdate({Name:"David"},{ $inc: { "Marks" : 10} });
{
   "_id" : ObjectId("5e516b24f8647eb59e56207b"),
   "Name" : "David",
   "Marks" : 78
}

출력 결과를 보면 반환된 문서의 Marks 값이 아직 78인 것을 확인할 수 있습니다. 이는 findOneAndUpdate()가 기본적으로 업데이트 이전의 원본 문서를 반환하기 때문입니다. 업데이트된 최신 문서를 받고 싶다면 옵션에 { returnNewDocument: true }(몽고 셸에서는 returnDocument: 'after')를 지정하면 됩니다.

다시 find() 메서드로 전체 문서를 조회해 변경 사항을 확인해 보겠습니다.

> db.demo328.find();

실행 결과는 다음과 같습니다.

{ "_id" : ObjectId("5e516b19f8647eb59e56207a"), "Name" : "Chris", "Marks" : 67 }
{ "_id" : ObjectId("5e516b24f8647eb59e56207b"), "Name" : "David", "Marks" : 88 }
{ "_id" : ObjectId("5e516b2bf8647eb59e56207c"), "Name" : "Bob", "Marks" : 97 }

David의 Marks 값이 78에서 88로 성공적으로 증가한 것을 확인할 수 있습니다. 이처럼 findOneAndUpdate()는 조건에 맞는 단일 문서를 원자적으로(atomically) 찾아 수정하므로, 조회와 업데이트를 하나의 작업으로 처리해야 하는 상황에서 매우 유용하게 사용됩니다.