MongoDB에서 개별 문서를 하나씩 수정하지 않고, 키-값 쌍으로 이루어진 목록을 활용하면 여러 문서를 한 번의 작업으로 효율적으로 업데이트할 수 있습니다. 이 글에서는 벌크(bulk) 연산을 사용해 다수의 문서를 일괄 업데이트하는 방법을 단계별로 살펴보겠습니다.
1. 컬렉션 생성 및 문서 삽입
먼저 데모용 컬렉션을 만들고 문서를 삽입합니다. insertOne() 메서드를 사용하면 됩니다.
> db.demo227.insertOne({"_id":"101","Name":"Chris"});
{ "acknowledged" : true, "insertedId" : "101" }
> db.demo227.insertOne({"_id":"102","Name":"Bob"});
{ "acknowledged" : true, "insertedId" : "102" }2. 현재 저장된 문서 확인
find() 메서드를 사용하면 컬렉션에 있는 모든 문서를 조회할 수 있습니다.
> db.demo227.find();
위 쿼리는 다음과 같은 결과를 출력합니다.
{ "_id" : "101", "Name" : "Chris" }
{ "_id" : "102", "Name" : "Bob" }3. 키-값 쌍 목록으로 일괄 업데이트하기
이제 핵심 부분입니다. 업데이트할 데이터를 배열로 준비한 뒤, initializeUnorderedBulkOp()로 벌크 연산 객체를 생성하고 반복문을 통해 각 문서를 매칭하여 업데이트합니다.
- bulkUpdateValue: 변경할
_id와 새로운Name값을 담은 배열입니다. - initializeUnorderedBulkOp(): 순서에 상관없이 병렬로 실행되는 벌크 연산을 초기화합니다.
- $set 연산자: 지정한 필드만 선택적으로 수정할 때 사용합니다.
> var bulkUpdateValue = [{"_id": "101", "Name": "Robert"},
... {"_id": "102", "Name": "Sam"}
...];
> var bulkUpdate = db.demo227.initializeUnorderedBulkOp();
> var updateCounter= undefined;
> for (var i = 0; i < bulkUpdateValue.length; i++){
... updateCounter = bulkUpdateValue[i];
... bulkUpdate.find( {_id: updateCounter._id} ).update( {$set: {Name: updateCounter.Name}} );
... }
> bulkUpdate.execute();
BulkWriteResult({
"writeErrors" : [ ],
"writeConcernErrors" : [ ],
"nInserted" : 0,
"nUpserted" : 0,
"nMatched" : 2,
"nModified" : 2,
"nRemoved" : 0,
"upserted" : [ ]
})BulkWriteResult 결과를 보면 nMatched: 2, nModified: 2로 표시되는데, 이는 두 개의 문서가 조건에 매칭되었고 두 개 모두 성공적으로 수정되었다는 의미입니다. 또한 writeErrors가 비어 있으므로 오류 없이 처리된 것입니다.
4. 업데이트 결과 확인
다시 find() 메서드로 전체 문서를 조회해 변경 사항을 확인합니다.
> db.demo227.find();
실행 결과는 다음과 같습니다.
{ "_id" : "101", "Name" : "Robert" }
{ "_id" : "102", "Name" : "Sam" }정리
이처럼 MongoDB에서는 initializeUnorderedBulkOp()와 반복문을 조합하면 키-값 쌍 목록에 담긴 데이터를 기준으로 여러 문서를 한 번의 네트워크 요청으로 효율적으로 업데이트할 수 있습니다. 대량의 데이터를 다룰 때 개별 updateOne() 호출보다 성능 면에서 큰 이점이 있으므로, 실무에서 일괄 수정 작업이 필요하다면 벌크 연산을 적극 활용해 보시기 바랍니다.