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

MongoDB에서 여러 문서를 원자적으로 업데이트하는 방법

MongoDB에서 조건에 일치하는 여러 문서를 한 번에 원자적으로 업데이트하려면 update() 메서드와 $set 연산자를 함께 사용하면 됩니다. 이때 네 번째 인자인 multi 옵션을 true로 설정해야 단일 문서가 아닌 일치하는 모든 문서가 수정됩니다.

1. 샘플 컬렉션 생성하기

먼저 데모용 컬렉션을 만들고 문서를 삽입합니다.

> db.demo699.insertOne({Name:"Chris Brown"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5ea6e370551299a9f98c93a7")
}
> db.demo699.insertOne({Name:"David Miller"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5ea6e37a551299a9f98c93a8")
}
> db.demo699.insertOne({Name:"Chris Brown"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5ea6e381551299a9f98c93a9")
}
> db.demo699.insertOne({Name:"John Doe"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5ea6e38a551299a9f98c93aa")
}

위 예제에서는 이름이 "Chris Brown"인 문서가 두 개 존재합니다. 이 두 문서를 동시에 수정하는 것이 목표입니다.

2. 현재 저장된 문서 확인하기

find() 메서드를 사용하면 컬렉션의 모든 문서를 조회할 수 있습니다.

> db.demo699.find();

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

{ "_id" : ObjectId("5ea6e370551299a9f98c93a7"), "Name" : "Chris Brown" }
{ "_id" : ObjectId("5ea6e37a551299a9f98c93a8"), "Name" : "David Miller" }
{ "_id" : ObjectId("5ea6e381551299a9f98c93a9"), "Name" : "Chris Brown" }
{ "_id" : ObjectId("5ea6e38a551299a9f98c93aa"), "Name" : "John Doe" }

3. 다중 원자 업데이트 쿼리 실행하기

이제 Name 필드가 "Chris Brown"인 모든 문서를 "Adam Smith"로 변경합니다. update() 호출 시 네 번째 매개변수를 true로 지정하면 일치하는 모든 문서가 한 번의 작업으로 갱신됩니다.

> db.demo699.update({Name:"Chris Brown"},{ $set : { Name: "Adam Smith"} }, false, true );
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })

결과를 보면 nMatched : 2, nModified : 2로 표시되어, 조건에 맞는 두 개의 문서가 모두 성공적으로 수정되었음을 알 수 있습니다.

4. 업데이트 결과 확인하기

다시 find() 메서드로 전체 문서를 조회해 보겠습니다.

> db.demo699.find();

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

{ "_id" : ObjectId("5ea6e370551299a9f98c93a7"), "Name" : "Adam Smith" }
{ "_id" : ObjectId("5ea6e37a551299a9f98c93a8"), "Name" : "David Miller" }
{ "_id" : ObjectId("5ea6e381551299a9f98c93a9"), "Name" : "Adam Smith" }
{ "_id" : ObjectId("5ea6e38a551299a9f98c93aa"), "Name" : "John Doe" }

참고: 최신 MongoDB에서는 updateMany() 권장

MongoDB 3.2 이상 버전에서는 위와 같은 update() 방식 대신 의미가 더 명확한 updateMany() 메서드를 사용하는 것이 좋습니다. 동일한 작업을 다음과 같이 작성할 수 있습니다.

> db.demo699.updateMany(
...    { Name: "Chris Brown" },
...    { $set: { Name: "Adam Smith" } }
... );
{ "acknowledged" : true, "matchedCount" : 2, "modifiedCount" : 2 }

$set 연산자는 지정한 필드만 선택적으로 변경하며, MongoDB는 단일 문서에 대한 모든 쓰기 작업을 원자적으로 처리하므로 위 방식은 데이터 정합성을 유지하면서 여러 문서를 안전하게 갱신할 수 있는 방법입니다.