대량 쓰기 작업
이 페이지의 내용
개요
MongoDB는 쓰기 작업을 일괄적으로 수행할 수 있는 기능을 제공합니다. 대량 쓰기 작업은 단일 컬렉션에 영향을 줍니다. MongoDB를 사용하면 애플리케이션이 대량 쓰기 작업에 필요한 허용 가능한 승인 수준을 결정할 수 있습니다.
db.collection.bulkWrite()
메서드는 대량 삽입, 업데이트 및 삭제 작업을 수행할 수 있는 기능을 제공합니다.
MongoDB는 db.collection.insertMany()
메서드를 통한 대량 삽입도 지원합니다.
순서가 지정된 연산과 순서가 지정되지 않은 연산
대량 쓰기 작업은 순서가 지정되거나 정렬되지 않을 수 있습니다.
MongoDB는 순서가 지정된 작업 목록을 사용하여 작업을 순차적으로 실행합니다. 쓰기 작업 중 하나를 처리하는 동안 오류가 발생하면 MongoDB는 목록의 나머지 쓰기 작업을 처리하지 않고 반환됩니다. 주문된 대량 쓰기보기
순서가 지정되지 않은 작업 목록을 사용하면 MongoDB가 작업을 병렬로 실행할 수 있지만 이러한 동작이 보장되지는 않습니다. 쓰기 작업 중 하나를 처리하는 동안 오류가 발생하더라도 MongoDB는 목록에 있는 나머지 쓰기 작업을 계속 처리합니다. 정렬되지 않은 대량 쓰기 예시를참조하십시오.
샤드 컬렉션에서 정렬된 작업 목록을 실행하는 것은 정렬되지 않은 목록을 실행하는 것보다 일반적으로 느립니다. 정렬된 목록에서는 각 작업이 이전 작업이 완료될 때까지 기다려야 하기 때문입니다.
기본적으로 bulkWrite()
는 ordered
작업을 수행합니다. unordered
쓰기 작업을 지정하려면 ordered : false
옵션 문서에서 을(를) 설정합니다.
작업 실행 참조
bulkWrite() 메서드
bulkWrite()
는 다음과 같은 쓰기 작업을 지원합니다.
각 쓰기 작업은 배열의 문서로 bulkWrite()
에 전달됩니다.
예시
이 섹션의 예시에서는 pizzas
다음과 같은 컬렉션을 사용합니다.
db.pizzas.insertMany( [ { _id: 0, type: "pepperoni", size: "small", price: 4 }, { _id: 1, type: "cheese", size: "medium", price: 7 }, { _id: 2, type: "vegan", size: "large", price: 8 } ] )
다음 bulkWrite()
예시는 pizzas
컬렉션에서 이러한 작업을 실행합니다.
0}을 사용하여 두 개의 문서를 추가합니다.
insertOne
0}을 사용하여 문서를 업데이트합니다.
updateOne
0}을(를) 사용하여 문서를 삭제합니다.
deleteOne
0}을 사용하여 문서를 바꿉니다.
replaceOne
try { db.pizzas.bulkWrite( [ { insertOne: { document: { _id: 3, type: "beef", size: "medium", price: 6 } } }, { insertOne: { document: { _id: 4, type: "sausage", size: "large", price: 10 } } }, { updateOne: { filter: { type: "cheese" }, update: { $set: { price: 8 } } } }, { deleteOne: { filter: { type: "pepperoni"} } }, { replaceOne: { filter: { type: "vegan" }, replacement: { type: "tofu", size: "small", price: 4 } } } ] ) } catch( error ) { print( error ) }
완료된 작업의 요약을 포함하는 예시 출력:
{ acknowledged: true, insertedCount: 2, insertedIds: { '0': 3, '1': 4 }, matchedCount: 2, modifiedCount: 2, deletedCount: 1, upsertedCount: 0, upsertedIds: {} }
더 많은 예시를 보려면 bulkWrite () 예시를 참조하세요.
분할된 컬렉션에 대한 대량 삽입을 위한 전략Strategies for bulk inserts to a Sharded Collection
초기 데이터 삽입 또는 일상적인 데이터 가져오기를 포함한 대량의 대량 삽입 작업은 샤딩된 클러스터 성능에 영향을 미칠 수 있습니다. 대량 삽입의 경우 다음 전략을 고려하세요:
컬렉션 사전 분할
샤딩된 컬렉션이 비어 있는 경우, 컬렉션에는 단일 샤드에 위치한 하나의 초기 청크만 있습니다. 그 후 MongoDB가 데이터를 수신하고, 분할을 생성하고, 분할 청크를 사용 가능한 샤드에 배포하는 데에는 시간이 걸립니다. 이러한 성능 비용을 방지하려면 샤딩된 클러스터의 청크 분할에 설명된 대로 컬렉션을 미리 분할할 수 있습니다.
정렬되지 않은 쓰기 대상 mongos
샤딩된 클러스터에 대한 쓰기 성능을 개선하려면 bulkWrite()
를 사용하며 선택적 매개변수 ordered
을 false
로 설정합니다. mongos
은 여러 샤드에 동시에 쓰기를 전송하려고 시도할 수 있습니다. 빈 컬렉션의 경우, 먼저 샤딩된 클러스터의 청크 분할에 설명된 대로 컬렉션을 미리 분할합니다.
단조로운 스로틀링 피하기
삽입하는 동안 샤드 키가 단조롭게 증가하면 모든 삽입된 데이터는 컬렉션의 마지막 청크로 이동하며 항상 단일 샤드에 저장됩니다. 따라서 클러스터의 삽입 용량은 해당 단일 샤드의 삽입 용량을 초과하지 않습니다.
삽입 볼륨이 단일 샤드로 처리할 수 있는 것보다 크거나 단조롭게 증가하는 샤드 키를 피할 수 없는 경우 애플리케이션을 다음과 같이 수정할 수 있습니다.
샤드 키의 이진 비트를 반전시킵니다. 이는 정보를 보존하고 값 시퀀스 증가와 삽입 순서의 상관 관계를 방지합니다.
인서트의 첫 번째와 마지막 16비트 단어를 "shuffle" 으로 바꿉니다.
예시
다음 예제는 C++에서 생성된 BSON ObjectId의 선행 및 후행 16비트 단어를 교체하여 더 이상 단조롭게 증가하지 않도록 합니다.
using namespace mongo; OID make_an_id() { OID x = OID::gen(); const unsigned char *p = x.getData(); swap( (unsigned short&) p[0], (unsigned short&) p[10] ); return x; } void foo() { // create an object BSONObj o = BSON( "_id" << make_an_id() << "x" << 3 << "name" << "jane" ); // now we may insert o into a sharded collection }