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

MongoDB에서 bulkWrite()로 여러 문서를 한 번의 쿼리로 업데이트하는 방법

MongoDB에서 하나의 쿼리만으로 여러 문서를 업데이트하려면 bulkWrite() 메서드를 사용하면 됩니다. 이 메서드는 삽입, 수정, 삭제 등 다양한 쓰기 작업을 하나의 요청으로 일괄 처리할 수 있어 성능 면에서도 매우 효율적입니다.

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

먼저 예제 문서들을 담은 컬렉션을 생성해 보겠습니다.

> db.demo760.insertOne({id:1,details:{Value1:100,Value2:50}});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5eb0309f5637cd592b2a4aee")
}
> db.demo760.insertOne({id:2,details:{Value1:60,Value2:70}});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5eb030a15637cd592b2a4aef")
}
> db.demo760.insertOne({id:3,details:{Value1:80,Value2:90}});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5eb030a15637cd592b2a4af0")
}

2. 컬렉션의 모든 문서 조회하기

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

> db.demo760.find();

위 쿼리는 다음과 같은 결과를 출력합니다.

{ "_id" : ObjectId("5eb0309f5637cd592b2a4aee"), "id" : 1, "details" : { "Value1" : 100, "Value2" : 50 } }
{ "_id" : ObjectId("5eb030a15637cd592b2a4aef"), "id" : 2, "details" : { "Value1" : 60, "Value2" : 70 } }
{ "_id" : ObjectId("5eb030a15637cd592b2a4af0"), "id" : 3, "details" : { "Value1" : 80, "Value2" : 90 } }

3. bulkWrite()로 여러 문서 한 번에 업데이트하기

이제 bulkWrite()를 사용해 여러 개의 updateOne 작업을 하나의 쿼리로 실행해 보겠습니다. 각 작업 객체에는 필터 조건(filter)과 변경 내용(update)을 지정합니다.

> db.demo760.bulkWrite([
...     {
...        updateOne: {
...           filter: {id: 1},
...           update: {$set: {'details.Value1': 900, 'details.Value2': 500}},
...        }
...     },
...     {
...     updateOne: {
...        filter: {id: 2},
...        update: {$set: {'details.Value1': 1000, 'details.Value2': 2000}},
...     },
... }
... ])
{
    "acknowledged" : true,
    "deletedCount" : 0,
    "insertedCount" : 0,
    "matchedCount" : 2,
    "upsertedCount" : 0,
    "insertedIds" : {
    },
    "upsertedIds" : {
    }
}

실행 결과에서 matchedCount: 2가 반환된 것을 볼 수 있는데, 이는 두 개의 문서가 조건에 일치하여 업데이트되었음을 의미합니다.

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

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

> db.demo760.find();

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

{ "_id" : ObjectId("5eb0309f5637cd592b2a4aee"), "id" : 1, "details" : { "Value1" : 900, "Value2" : 500 } }
{ "_id" : ObjectId("5eb030a15637cd592b2a4aef"), "id" : 2, "details" : { "Value1" : 1000, "Value2" : 2000 } }
{ "_id" : ObjectId("5eb030a15637cd592b2a4af0"), "id" : 3, "details" : { "Value1" : 80, "Value2" : 90 } }

출력 결과를 보면 id가 1인 문서와 id가 2인 문서의 값이 각각 변경되었고, id가 3인 문서는 그대로 유지된 것을 확인할 수 있습니다.

핵심 정리

  • bulkWrite()는 여러 쓰기 작업(updateOne, updateMany, insertOne, deleteOne 등)을 하나의 요청으로 처리합니다.
  • 개별적으로 쿼리를 반복 실행하는 것보다 네트워크 왕복 횟수가 줄어들어 대량 업데이트 시 성능이 크게 향상됩니다.
  • 결과 응답의 matchedCount, modifiedCount, upsertedCount 등을 통해 각 작업의 처리 현황을 파악할 수 있습니다.