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()을 사용하면 됩니다.