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

MongoDB에서 키-값 쌍 목록으로 여러 문서를 한 번에 업데이트하는 방법

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() 호출보다 성능 면에서 큰 이점이 있으므로, 실무에서 일괄 수정 작업이 필요하다면 벌크 연산을 적극 활용해 보시기 바랍니다.