Bulk.execute()
팁
MongoDB 는 대량 쓰기 (write) 작업을 수행하기 위해 db.collection.bulkWrite()
도 제공합니다.
설명
Bulk.execute()
Bulk()
작업 빌더에서 빌드한 작업 목록을 실행합니다.Bulk.execute()
는 다음 매개 변수를 허용합니다.Parameter유형설명writeConcern
문서선택 사항입니다. 대량 작업 전체에 대한 쓰기 고려 문서입니다. 기본값을 사용하려면 생략합니다. 독립형
mongod
서버의 경우 쓰기 고려는 기본적으로{ w: majority }
입니다. 복제본 세트의 경우, 복제본 세트 구성의 일부로 수정하거나 잠재적으로 복제본 세트에 여러 중재자가 포함되어 있는 경우를 제외하고는 기본 쓰기 고려는{ w: majority }
입니다.예는 기본 쓰기 고려 재정의를 참조하세요.
트랜잭션에서 실행되는 경우 작업에 대한 쓰기 고려를 명시적으로 설정하지 마세요. 트랜잭션에 쓰기 고려를 사용하려면 트랜잭션 및 쓰기 고려를 참조하세요.
반환합니다: 작업 상태를 포함하는 BulkWriteResult()
객체입니다.실행 후에는 다시 초기화하지 않고는
Bulk()
객체를 다시 실행할 수 없습니다.db.collection.initializeUnorderedBulkOp()
및db.collection.initializeOrderedBulkOp()
을 참조하세요.
행동
순서가 지정된 연산
MongoDB는 ordered
연산 목록을 실행할 경우 operation type
및 연속성을 기준으로 연산을 그룹화합니다(즉, 같은 유형의 연속 연산이 함께 그룹화됨). 그 예로 순서가 지정된 목록에 삽입 연산 2개가 먼저 나오고 그 다음에 업데이트 연산, 또 그 다음에는 다른 삽입 연산이 있는 경우, MongoDB는 이 연산들을 3개의 개별 그룹으로 그룹화합니다. 첫 번째 그룹에는 삽입 연산 2개, 두 번째 그룹에는 업데이트 연산, 세 번째 그룹에는 마지막 삽입 연산이 포함됩니다. 이 동작은 이후의 버전에서 변경될 수 있습니다.
mongosh
의 Bulk()
작업과 드라이버의 유사한 메서드에는 그룹의 작업 수에 대한 제한이 없습니다. 대량 작업 실행을 위해 작업이 어떻게 그룹화되는지 확인하려면 실행 후 Bulk.getOperations()
를 호출합니다.
샤드 컬렉션에서 ordered
작업 목록을 실행하는 것은 unordered
목록을 실행하는 것보다 일반적으로 느립니다. 정렬된 목록에서는 각 작업이 이전 작업이 완료될 때까지 기다려야 하기 때문입니다.
순서가 지정되지 않은 연산
MongoDB는 unordered
연산 목록을 실행할 경우 이 연산들을 그룹화합니다. 순서가 지정되지 않은 대량 연산이 있으면 성능 향상을 위해 목록에 속한 연산의 순서를 변경할 수 있습니다. 따라서 애플리케이션은 unordered
대량 연산을 수행할 때 순서에 의존해서는 안 됩니다.
mongosh
의 Bulk()
작업과 드라이버의 유사한 메서드에는 그룹의 작업 수에 대한 제한이 없습니다. 대량 작업 실행을 위해 작업이 어떻게 그룹화되는지 확인하려면 실행 후 Bulk.getOperations()
를 호출합니다.
트랜잭션
Bulk()
는 분산 트랜잭션 내에서 사용할 수 있습니다.
Bulk.insert()
연산에서는 이 컬렉션이 이미 존재해야 합니다.
Bulk.find.upsert()
연산에서 연산 결과 업서트가 발생할 경우에는 이 컬렉션이 이미 존재해야 합니다.
트랜잭션에서 실행되는 경우 작업에 대한 쓰기 고려를 명시적으로 설정하지 마세요. 트랜잭션에 쓰기 고려를 사용하려면 트랜잭션 및 쓰기 고려를 참조하세요.
중요
대부분의 경우 분산 트랜잭션은 단일 문서 쓰기에 비해 더 큰 성능 비용이 발생하므로 분산 트랜잭션의 가용성이 효과적인 스키마 설계를 대체할 수는 없습니다. 대부분의 시나리오에서 비정규화된 데이터 모델 (내장된 문서 및 배열) 은 계속해서 데이터 및 사용 사례에 최적일 것입니다. 즉, 대부분의 시나리오에서 데이터를 적절하게 모델링하면 분산 트랜잭션의 필요성이 최소화됩니다.
추가 트랜잭션 사용 고려 사항(예: 런타임 제한 및 oplog 크기 제한)은 프로덕션 고려사항을 참조하세요.
예시
대량 작업 실행
다음은 items
컬렉션에서 Bulk()
작업 빌더를 초기화하고, 일련의 삽입 작업을 추가하고, 작업을 실행합니다.
var bulk = db.items.initializeUnorderedBulkOp(); bulk.insert( { item: "abc123", status: "A", defaultQty: 500, points: 5 } ); bulk.insert( { item: "ijk123", status: "A", defaultQty: 100, points: 10 } ); bulk.execute( );
이 작업은 다음 BulkWriteResult()
객체를 반환합니다.
BulkWriteResult({ acknowledged: true, insertedCount: 2, insertedIds: { '0': ObjectId("64e61e3b84ff8808cd43a92c"), '1': ObjectId("64e61e3b84ff8808cd43a92d") }, matchedCount: 0, modifiedCount: 0, deletedCount: 0, upsertedCount: 0, upsertedIds: {} })
반환 객체에 대한 자세한 내용은 BulkWriteResult()
를 참조하세요. 실행된 일괄 처리에 대한 자세한 내용은 Bulk.getOperations()
를 참조하세요.
기본 쓰기 우려 재정의
복제본 세트에 대한 다음 작업은 wtimeout
이 5000밀리초인 "w: 1"
의 쓰기 고려를 지정하여 쓰기가 투표권이 있는 복제본 세트 노드의 과반수로 전파되거나 메서드가 5초 후에 시간 초과된 후에 메서드가 반환되도록 합니다.
var bulk = db.items.initializeUnorderedBulkOp(); bulk.insert( { item: "efg123", status: "A", defaultQty: 100, points: 0 } ); bulk.insert( { item: "xyz123", status: "A", defaultQty: 100, points: 0 } ); bulk.execute( { w: 1, wtimeout: 5000 } );
이 작업은 다음 BulkWriteResult()
객체를 반환합니다.
BulkWriteResult({ acknowledged: true, insertedCount: 2, insertedIds: { '0': ObjectId("64e61e3b84ff8808cd43a92c"), '1': ObjectId("64e61e3b84ff8808cd43a92d") }, matchedCount: 0, modifiedCount: 0, deletedCount: 0, upsertedCount: 0, upsertedIds: {} })