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

MongoDB에서 여러 문서를 한 번에 업데이트하는 방법 (multi 옵션 완벽 가이드)

MongoDB에서 조건에 일치하는 여러 문서를 동시에 업데이트하려면 update() 메서드의 세 번째 인자로 multi: true 옵션을 반드시 지정해야 합니다. 이 옵션이 없으면 기본적으로 조건과 일치하는 첫 번째 문서만 수정됩니다.

1. 테스트용 컬렉션 생성하기

먼저 insertOne() 메서드를 사용해 문서가 담긴 컬렉션을 만들어 보겠습니다.

> db.multiUpdateDemo.insertOne({"ClientName":"John","ClientAge":29});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cda5bc0b50a6c6dd317adc8")
}
> db.multiUpdateDemo.insertOne({"ClientName":"Carol","ClientAge":31});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cda5bc1b50a6c6dd317adc9")
}
> db.multiUpdateDemo.insertOne({"ClientName":"John","ClientAge":39});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cda5bc3b50a6c6dd317adca")
}
> db.multiUpdateDemo.insertOne({"ClientName":"John","ClientAge":41});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cda5bc5b50a6c6dd317adcb")
}
> db.multiUpdateDemo.insertOne({"ClientName":"David","ClientAge":35});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cda5bc6b50a6c6dd317adcc")
}

2. 전체 문서 조회하기

find() 메서드를 사용해 컬렉션의 모든 문서를 확인합니다.

> db.multiUpdateDemo.find().pretty();

위 쿼리는 아래와 같은 결과를 출력합니다.

{
   "_id" : ObjectId("5cda5bc0b50a6c6dd317adc8"),
   "ClientName" : "John",
   "ClientAge" : 29
}
{
   "_id" : ObjectId("5cda5bc1b50a6c6dd317adc9"),
   "ClientName" : "Carol",
   "ClientAge" : 31
}
{
   "_id" : ObjectId("5cda5bc3b50a6c6dd317adca"),
   "ClientName" : "John",
   "ClientAge" : 39
}
{
   "_id" : ObjectId("5cda5bc5b50a6c6dd317adcb"),
   "ClientName" : "John",
   "ClientAge" : 41
}
{
   "_id" : ObjectId("5cda5bc6b50a6c6dd317adcc"),
   "ClientName" : "David",
   "ClientAge" : 35
}

현재 'John'이라는 이름을 가진 문서가 총 3개 있으며, 각각 나이가 29세, 39세, 41세로 서로 다릅니다.

3. multi: true 옵션으로 여러 문서 업데이트하기

이제 multi: true 옵션을 적용한 다중 업데이트 쿼리를 실행해 보겠습니다. 아래 쿼리는 'ClientName'이 "John"인 3개의 문서를 모두 찾아 나이를 34세로 일괄 변경합니다.

> db.multiUpdateDemo.update({'ClientName': 'John'}, {$set: {'ClientAge': 34}}, {multi: true});
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 3 })

실행 결과인 WriteResult를 살펴보면 nMatched: 3(조건에 일치한 문서 수)와 nModified: 3(실제 수정된 문서 수)를 통해 세 개의 문서가 모두 성공적으로 업데이트되었음을 확인할 수 있습니다.

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

다시 전체 문서를 조회해 변경 사항을 검증해 보겠습니다.

> db.multiUpdateDemo.find().pretty();

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

{
   "_id" : ObjectId("5cda5bc0b50a6c6dd317adc8"),
   "ClientName" : "John",
   "ClientAge" : 34
}
{
   "_id" : ObjectId("5cda5bc1b50a6c6dd317adc9"),
   "ClientName" : "Carol",
   "ClientAge" : 31
}
{
   "_id" : ObjectId("5cda5bc3b50a6c6dd317adca"),
   "ClientName" : "John",
   "ClientAge" : 34
}
{
   "_id" : ObjectId("5cda5bc5b50a6c6dd317adcb"),
   "ClientName" : "John",
   "ClientAge" : 34
}
{
   "_id" : ObjectId("5cda5bc6b50a6c6dd317adcc"),
   "ClientName" : "David",
   "ClientAge" : 35
}

'John'의 나이가 모두 34로 변경된 것을 확인할 수 있습니다. 반면 'Carol'과 'David'의 문서는 조건에 해당하지 않으므로 그대로 유지됩니다.

참고: 최신 MongoDB 버전에서의 대안

MongoDB 4.2 이상 버전에서는 update() 메서드가 deprecated(사용 중단 권고)되었으며, 대신 updateMany()updateOne() 메서드 사용이 권장됩니다. 위 예제와 동일한 결과는 다음과 같이 얻을 수 있습니다.

> db.multiUpdateDemo.updateMany(
...    {'ClientName': 'John'},
...    {$set: {'ClientAge': 34}}
... );

updateMany()는 기본적으로 조건에 일치하는 모든 문서를 수정하므로 별도의 multi 옵션이 필요 없습니다. 하나의 문서만 수정하려면 updateOne()을 사용하면 됩니다.