Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Docs Menu
Docs Home
/
데이터베이스 매뉴얼
/

대량 쓰기 작업

MongoDB 클라이언트가 쓰기 (write) 작업을 대량으로 수행할 수 기능 제공합니다. MongoDB 8.0부터는 여러 데이터베이스 및 컬렉션에서 대량 쓰기 (write) 작업을 수행할 수 있습니다. MongoDB 8.0 이전 버전을 사용하는 경우 단일 컬렉션 에서 대량 쓰기 (write) 작업을 수행할 수 있습니다.

MongoDB 8.0의 여러 데이터베이스 및 컬렉션에 걸쳐 대량 쓰기 (write) 작업을 수행하려면 bulkWrite 데이터베이스 명령 또는 Mongo.bulkWrite() mongosh 메서드를 사용합니다.

단일 컬렉션 에서 대량 쓰기 (write) 작업을 수행하려면 db.collection.bulkWrite() mongosh 메서드를 사용합니다. MongoDB 8.0 이상을 실행 하는 경우 bulkWrite 또는 Mongo.bulkWrite() 를 사용하여 단일 컬렉션 에 쓰기 (write) 수도 있습니다.

대량 쓰기 (write) 작업을 순서가 지정되거나 정렬되지 않도록 설정할 수 있습니다.

MongoDB 순서가 지정된 작업 목록을 사용하여 작업을 순차적으로 실행합니다. 쓰기 (write) 작업 중 하나를 처리 동안 오류가 발생하면 MongoDB 목록에 남아 있는 쓰기 (write) 작업을 처리 하지 않고 반환됩니다.

순서가 지정되지 않은 작업 목록을 사용하면 MongoDB가 작업을 병렬로 실행할 수 있지만 이러한 동작이 보장되지는 않습니다. 쓰기 작업 중 하나를 처리하는 동안 오류가 발생하더라도 MongoDB는 목록에 있는 나머지 쓰기 작업을 계속 처리합니다.

샤드 컬렉션에서 정렬된 작업 목록을 실행하는 것은 정렬되지 않은 목록을 실행하는 것보다 일반적으로 느립니다. 정렬된 목록에서는 각 작업이 이전 작업이 완료될 때까지 기다려야 하기 때문입니다.

기본값 으로 모든 대량 쓰기 (write) 명령과 메서드는 순서가 지정된 작업을 수행합니다. 순서가 지정되지 않은 작업을 지정하려면 선호하는 명령이나 메서드를 호출할 때 ordered 옵션을 false 로 설정하다 . 각 명령 또는 메서드의 구문에 대해 자세히 학습 위에 링크된 페이지를 참조하세요.

모든 대량 쓰기 (write) 메서드 및 명령은 다음과 같은 쓰기 (write) 작업을 지원 .

  • insertOne

  • UpdateOne

  • UpdateMany

  • replaceOne

  • deleteOne

  • deleteMany

선호하는 명령이나 메서드를 호출할 때 각 쓰기 (write) 작업을 배열 의 문서 로 전달합니다. 각 명령 또는 메서드의 구문에 대해 자세히 학습 위에 링크된 페이지를 참조하세요.

db.collection.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: {}
}

더 많은 예제는 db를 참조하세요. 컬렉션.bulkWrite() 예제.

이 예시 Mongo.bulkWrite() 를 사용하여 다음 작업을 순서대로 수행합니다.

  • db.authors 컬렉션 에 문서 삽입합니다.

  • db.books 컬렉션 에 문서 삽입합니다.

  • 이전 문서 업데이트합니다.

db.getMongo().bulkWrite(
[
{
namespace: 'db.authors',
name: 'insertOne',
document: { name: 'Stephen King' }
},
{
namespace: 'db.books',
name: 'insertOne',
document: { name: 'It' }
},
{
namespace: 'db.books',
name: 'updateOne',
filter: { name: 'it' },
update: { $set: { year: 1986 } }
}
],
{
ordered: true,
bypassDocumentValidation: true
}
)

mongosh 대량 쓰기 (write) 순서대로 수행하고 다음 문서 반환합니다.

{
acknowledged: true,
insertedCount: 2,
matchedCount: 1,
modifiedCount: 1,
deletedCount: 0,
upsertedCount: 0,
insertResults: { '1': { insertedId: ObjectId('67ed8ce8efd926c84cab7945') },
'2': { insertedId: ObjectId('67ed8ce8efd926c84cab7946') } }
updateResults: { '1': { matchedCount: 1, modifiedCount: 1, didUpsert: false } }
}

초기 데이터 삽입 또는 일상적인 데이터 가져오기를 포함한 대량의 대량 삽입 작업은 샤딩된 클러스터 성능에 영향을 미칠 수 있습니다. 대량 삽입의 경우 다음 전략을 고려하세요:

샤딩된 컬렉션이 비어 있고 샤드 키의 첫 번째 키에 해시된 샤딩을 사용하지 않는 경우, 컬렉션에는 단일 샤드에 위치한 하나의 초기 청크만 있습니다. 그 후 MongoDB가 데이터를 수신하고 청크를 사용 가능한 샤드에 배포하는 데에는 시간이 걸립니다. 이러한 성능 비용을 방지하려면 샤딩된 클러스터에서 범위를 생성하여 컬렉션을 미리 분할하세요.

샤딩된 클러스터에 대한 쓰기 (write) 성능을 향상시키려면 선호하는 메서드 또는 명령을 호출할 때 orderedfalse 로 설정하여 순서가 지정되지 않은 대량 쓰기 (write) 수행합니다. 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
}

샤드 키 선택에 대한 정보는 샤드 키를 참조 하세요. 샤드 키 내부 (특히, 샤드 키 선택)도 참조하세요.

돌아가기

방법

이 페이지의 내용