대량 쓰기 작업
개요
이 가이드 에서는 .NET/ C# 드라이버 를 사용하여 MongoClient
인스턴스 에서 대량 쓰기 (write) 작업을 수행하는 방법을 보여줍니다. 대량 쓰기 (write) 작업은 하나 이상의 MongoDB 컬렉션에 대해 여러 쓰기 (write) 작업을 수행하는 단일 데이터베이스 호출입니다. 이렇게 하면 애플리케이션 과 데이터베이스 간의 왕복 횟수가 줄어들기 때문에 개별 쓰기 (write) 작업을 여러 번 수행하는 것보다 더 효율적입니다.
샘플 데이터
sample_restaurants.restaurants
이 가이드 의 예제에서는Atlas 샘플 데이터 세트의 컬렉션 을 사용합니다. 무료 MongoDB Atlas cluster 를 생성하고 샘플 데이터 세트를 로드하는 방법을 학습보려면 빠른 시작 튜토리얼을 참조하세요.
쓰기 작업 정의
수행하려는 각 쓰기 (write) 작업에 대해 다음 BulkWriteModel
클래스 중 하나의 인스턴스 를 만듭니다.
BulkWriteInsertOneModel<TDocument>
BulkWriteUpdateOneModel<TDocument>
BulkWriteUpdateManyModel<TDocument>
BulkWriteReplaceOneModel<TDocument>
BulkWriteDeleteOneModel<TDocument>
BulkWriteDeleteManyModel<TDocument>
다음 섹션에서는 이전 클래스의 인스턴스를 만들고 사용하여 대량 쓰기 (write) 에서 해당 쓰기 (write) 작업을 수행하는 방법을 보여줍니다.
팁
POCO를 사용한 대량 쓰기 작업
이 가이드 의 예제에서는 모든 일반 클래스의 TDocument
유형에 BsonDocument
유형을 사용합니다. 이러한 클래스에 POCO(Plain Old CLR Object)를 사용할 수도 있습니다. 이렇게 하려면 컬렉션 의 문서를 나타내는 클래스를 정의해야 합니다. 클래스에는 문서의 필드와 일치하는 속성이 있어야 합니다. 자세한 내용은 POCO를 참조하세요.
삽입 작업
삽입 작업을 수행하려면 BulkWriteInsertOneModel<TDocument>
클래스의 인스턴스 를 만듭니다. BulkWriteInsertOneModel<TDocument>
생성자는 다음 매개변수를 허용합니다.
Parameter | 설명 |
---|---|
| The database and collection to insert the BSON document into. Data Type: string or CollectionNamespace |
| The document to insert into the collection. Data Type: TDocument |
다음 예시 에서는 BulkWriteInsertOneModel<TDocument>
클래스의 인스턴스 를 만듭니다. 이 인스턴스 는 운전자 에 "name"
필드 가 "Mongo's Deli"
인 문서 를 sample_restaurants.restaurants
컬렉션 에 삽입하도록 지시합니다.
var insertOneModel = new BulkWriteInsertOneModel<BsonDocument>( "sample_restaurants.restaurants", new BsonDocument{ { "name", "Mongo's Deli" }, { "cuisine", "Sandwiches" }, { "borough", "Manhattan" }, { "restaurant_id", "1234" } } );
팁
여러 문서를 삽입합니다.
여러 문서를 삽입하려면 삽입하려는 각 문서 에 대해 BulkWriteInsertOneModel<TDocument>
클래스의 인스턴스 를 만듭니다.
업데이트 작업
단일 문서 를 업데이트 하려면 BulkWriteUpdateOneModel<TDocument>
클래스의 인스턴스 를 만듭니다. BulkWriteUpdateOneModel<TDocument>
생성자는 다음 매개변수를 허용합니다.
Parameter | 설명 |
---|---|
| The database and collection to insert the BSON document into. Data Type: string or CollectionNamespace |
| The query filter that specifies the criteria used to match documents in your collection.
The UpdateOne operation updates only the first document that matches the
query filter.Data Type: FilterDefinition<TDocument> |
| The update operation you want to perform. For more information about update
operations, see Field Update Operators
in the MongoDB Server manual. Data Type: UpdateDefinition<TDocument> |
| Optional. The language collation to use when sorting results. See the
{+mdb+server+} manual
for more information. Data Type: Collation Default: null |
| Optional. The index to use to scan for documents.
See the MongoDB Server manual
for more information. Data Type: BsonValue Default: null |
| Optional. Specifies whether the update operation performs an upsert operation if no
documents match the query filter. See the MongoDB Server manual
for more information. Data Type: boolean Default: false |
| Specifies which array elements to modify for an update operation on an array field.
See the MongoDB Server manual
for more information. Data Type: IEnumerable<ArrayFilterDefinition> Default: null |
다음 코드 예시 에서 BulkWriteUpdateOneModel<BsonDocument>
객체 는 sample_restaurants.restaurants
컬렉션 에 대한 업데이트 작업을 나타냅니다. 이 작업은 name
필드 값이 "Mongo's Deli"
인 컬렉션 의 첫 번째 문서 와 일치합니다. 그런 다음 일치하는 문서 의 cuisine
필드 값을 "Sandwiches and Salads"
(으)로 업데이트합니다.
var updateOneModel = new BulkWriteUpdateOneModel<BsonDocument>( "sample_restaurants.restaurants", Builders<BsonDocument>.Filter.Eq("name", "Mongo's Deli"), Builders<BsonDocument>.Update.Set("cuisine", "Sandwiches and Salads") );
여러 문서를 업데이트 하려면 BulkWriteUpdateManyModel<TDocument>
클래스의 인스턴스 를 만듭니다. 이 클래스의 생성자는 BulkWriteUpdateOneModel<TDocument>
생성자와 동일한 매개변수를 허용합니다. BulkWriteUpdateManyModel<TDocument>
작업은 쿼리 필터하다 와 일치하는 모든 문서를 업데이트합니다.
다음 코드 예시 에서 BulkWriteUpdateManyModel<BsonDocument>
객체 는 sample_restaurants.restaurants
컬렉션 에 대한 업데이트 작업을 나타냅니다. 이 작업은 name
필드 값이 "Mongo's Deli"
인 컬렉션 의 모든 문서와 일치합니다. 그런 다음 cuisine
필드 의 값을 "Sandwiches and Salads"
(으)로 업데이트합니다.
var updateManyModel = new BulkWriteUpdateManyModel<BsonDocument>( "sample_restaurants.restaurants", Builders<BsonDocument>.Filter.Eq("name", "Mongo's Deli"), Builders<BsonDocument>.Update.Set("cuisine", "Sandwiches and Salads") );
대체 작업
문서 의 필드를 바꾸려면 BulkWriteReplaceOneModel<TDocument>
클래스의 인스턴스 를 만듭니다. BulkWriteReplaceOneModel<TDocument>
생성자는 다음 매개변수를 허용합니다.
Parameter | 설명 |
---|---|
| The database and collection to insert the BSON document into. Data Type: string or CollectionNamespace |
| The query filter that specifies the criteria used to match documents in your collection.
The UpdateOne operation updates only the first document that matches the
query filter.Data Type: FilterDefinition<TDocument> |
| The replacement document, which specifies the fields and values to insert in the
target document. Data Type: TDocument |
| Optional. The language collation to use when sorting results. See
the MongoDB Server manual
for more information. Data Type: Collation Default: null |
| Optional. The index to use to scan for documents.
See the MongoDB Server manual
for more information. Data Type: BsonValue Default: null |
| Optional. Specifies whether the update operation performs an upsert operation if no
documents match the query filter.
See the MongoDB Server manual
for more information. Data Type: boolean Default: false |
다음 예시 에서 BulkWriteReplaceOneModel<BsonDocument>
객체 는 sample_restaurants.restaurants
컬렉션 에 대한 바꾸기 작업을 나타냅니다. 이 작업은 restaurant_id
필드 값이 "1234"
인 컬렉션 의 문서 와 일치합니다. 그런 다음 이 문서 에서 _id
이외의 모든 필드를 제거하고 name
, cuisine
, borough
및 restaurant_id
필드에 새 값을 설정합니다.
var replaceOneModel = new BulkWriteReplaceOneModel<BsonDocument>( "sample_restaurants.restaurants", Builders<BsonDocument>.Filter.Eq("restaurant_id", "1234"), new BsonDocument{ { "name", "Mongo's Pizza" }, { "cuisine", "Pizza" }, { "borough", "Brooklyn" }, { "restaurant_id", "5678" } } );
팁
여러 문서 바꾸기
여러 문서를 대체하려면 대체하려는 각 문서 에 대해 BulkWriteReplaceOneModel<TDocument>
클래스의 인스턴스 를 만듭니다.
삭제 작업
문서 를 삭제 하려면 BulkWriteDeleteOneModel<TDocument>
클래스의 인스턴스 를 만듭니다. BulkWriteDeleteOneModel<TDocument>
생성자는 다음 매개변수를 허용합니다.
Parameter | 설명 |
---|---|
| The database and collection to insert the BSON document into. Data Type: string or CollectionNamespace |
| The query filter that specifies the criteria used to match documents in your collection.
The DeleteOne operation deletes only the first document that matches the
query filter.Data Type: FilterDefinition<TDocument> |
| Optional. The language collation to use when sorting results. See
the MongoDB Server manual
for more information. Data Type: Collation Default: null |
| Optional. The index to use to scan for documents.
See the MongoDB Server manual
for more information. Data Type: BsonValue Default: null |
다음 코드 예시 에서 BulkWriteDeleteOneModel<BsonDocument>
객체 는 sample_restaurants.restaurants
컬렉션 에 대한 삭제 작업을 나타냅니다. 이 작업은 restaurant_id
필드 값이 "5678"
인 첫 번째 문서 를 일치시키고 삭제합니다.
var deleteOneModel = new BulkWriteDeleteOneModel<BsonDocument>( "sample_restaurants.restaurants", Builders<BsonDocument>.Filter.Eq("restaurant_id", "5678") );
여러 문서를 삭제 하려면 BulkWriteDeleteManyModel<TDocument>
클래스의 인스턴스 를 만들고 삭제 하려는 문서 를 지정하는 쿼리 필터하다 를 전달합니다. DeleteMany
작업은 쿼리 필터하다 와 일치하는 모든 문서를 제거합니다.
다음 코드 예시 에서 BulkWriteDeleteManyModel<BsonDocument>
객체 는 sample_restaurants.restaurants
컬렉션 에 대한 삭제 작업을 나타냅니다. 이 작업은 name
필드 값이 "Mongo's Deli"
인 모든 문서를 일치시키고 삭제합니다.
var deleteManyModel = new BulkWriteDeleteManyModel<BsonDocument>( "sample_restaurants.restaurants", Builders<BsonDocument>.Filter.Eq("name", "Mongo's Deli") );
쓰기 작업 실행
수행하려는 각 작업에 대해 BulkWriteModel
인스턴스 를 정의한 후 IReadOnlyList
인터페이스를 구현하는 클래스의 인스턴스 를 만듭니다. BulkWriteModel
객체를 이 IReadOnlyList
에 추가한 다음 IReadOnlyList
를 BulkWrite()
또는 BulkWriteAsync()
메서드에 전달합니다. 기본값 으로 이러한 메서드는 컬렉션 에 정의된 순서대로 작업을 실행 합니다.
팁
IReadOnlyList
Array
및 List
은 IReadOnlyList
인터페이스를 구현 하는 두 가지 일반적인 클래스입니다.
비동기 BulkWriteAsync()
메서드 및 동기 BulkWrite()
메서드를 사용하여 대량 쓰기 (write) 작업을 수행하는 방법을 보려면 다음 탭에서 선택합니다.
var client = new MongoClient("mongodb://localhost:27017"); var collection = "sample_restaurants.restaurants"; var bulkWriteModels = new[] { new BulkWriteInsertOneModel<BsonDocument>( collection, new BsonDocument{ { "name", "Mongo's Deli" }, { "cuisine", "Sandwiches" }, { "borough", "Manhattan" }, { "restaurant_id", "1234" } } ), new BulkWriteInsertOneModel<BsonDocument>( collection, new BsonDocument{ { "name", "Mongo's Deli" }, { "cuisine", "Sandwiches" }, { "borough", "Brooklyn" }, { "restaurant_id", "5678" } } ), new BulkWriteUpdateManyModel<BsonDocument>( collection, Builders<BsonDocument>.Filter.Eq("name", "Mongo's Deli"), Builders<BsonDocument>.Update.Set("cuisine", "Sandwiches and Salads") ), new BulkWriteDeleteOneModel<BsonDocument>( collection, Builders<BsonDocument>.Filter.Eq("restaurant_id", "1234") ) }; var results = await client.BulkWriteAsync(bulkWriteModels); Console.WriteLine("Bulk write results: " + results);
var client = new MongoClient("mongodb://localhost:27017"); var collection = "sample_restaurants.restaurants"; var bulkWriteModels = new[] { new BulkWriteInsertOneModel<BsonDocument>( collection, new BsonDocument{ { "name", "Mongo's Deli" }, { "cuisine", "Sandwiches" }, { "borough", "Manhattan" }, { "restaurant_id", "1234" } } ), new BulkWriteInsertOneModel<BsonDocument>( collection, new BsonDocument{ { "name", "Mongo's Deli" }, { "cuisine", "Sandwiches" }, { "borough", "Brooklyn" }, { "restaurant_id", "5678" } } ), new BulkWriteUpdateManyModel<BsonDocument>( collection, Builders<BsonDocument>.Filter.Eq("name", "Mongo's Deli"), Builders<BsonDocument>.Update.Set("cuisine", "Sandwiches and Salads") ), new BulkWriteDeleteOneModel<BsonDocument>( collection, Builders<BsonDocument>.Filter.Eq("restaurant_id", "1234") ) }; var results = client.BulkWrite(bulkWriteModels); Console.WriteLine("Bulk write results: " + results);
앞의 코드 예제는 다음과 같은 출력을 생성합니다.
BulkWriteResult({'writeErrors': [], 'writeConcernErrors': [], 'nInserted': 2, 'nUpserted': 0, 'nMatched': 2, 'nModified': 2, 'nRemoved': 1, 'upserted': []}, acknowledged=True)
대량 쓰기 작업 사용자 지정
BulkWrite()
또는 BulkWriteAsync()
메서드를 호출할 때 ClientBulkWriteOptions
클래스의 인스턴스 를 전달할 수 있습니다. ClientBulkWriteOptions
클래스에는 대량 쓰기 (write) 작업을 구성하는 데 사용할 수 있는 옵션을 나타내는 다음 속성이 포함되어 있습니다.
속성 | 설명 |
---|---|
| Specifies whether the operation bypasses document-level validation. For more
information, see Schema
Validation in the MongoDB Server
manual. Defaults to false . |
| A comment to attach to the operation, in the form of a BsonValue . For
more information, see the delete command
fields guide in the
MongoDB Server manual. |
| If true , the driver performs the write operations in the order
provided. If an error occurs, the remaining operations are not
attempted.If false , the driver performs the operations in an
arbitrary order and attempts to perform all operations. If any of the write
operations in an unordered bulk write fail, the driver
reports the errors only after attempting all operations.Defaults to True . |
| A map of parameter names and values, in the form of a BsonDocument . Values
must be constant or closed
expressions that don't reference document fields. For more information,
see the let statement in the
MongoDB Server manual. |
| Specifies whether the ClientBulkWriteResult object returned by the operation
includes detailed results for each successful write operation.Defaults to false . |
| The write concern to use for the write operation, as a value from the WriteConcern
enum.Defaults to the write concern of the collection on which the operation is running. |
다음 코드 예제에서는 ClientBulkWriteOptions
객체 를 사용하여 삭제 작업을 사용자 지정합니다.
var client = new MongoClient("mongodb://localhost:27017"); var deleteOneModel = new BulkWriteDeleteOneModel<BsonDocument>( "sample_restaurants.restaurants", Builders<BsonDocument>.Filter.Eq("restaurant_id", "5678") ); var clientBulkWriteOptions = new ClientBulkWriteOptions { IsOrdered = false, WriteConcern = WriteConcern.Unacknowledged, VerboseResult = true }; var results = await client.BulkWriteAsync(deleteOneModel, clientBulkWriteOptions);
var client = new MongoClient("mongodb://localhost:27017"); var deleteOneModel = new BulkWriteDeleteOneModel<BsonDocument>( "sample_restaurants.restaurants", Builders<BsonDocument>.Filter.Eq("restaurant_id", "5678") ); var clientBulkWriteOptions = new ClientBulkWriteOptions { IsOrdered = false, WriteConcern = WriteConcern.Unacknowledged, VerboseResult = true }; var results = client.BulkWrite(deleteOneModel, clientBulkWriteOptions);
반환 값
BulkWrite()
및 BulkWriteAsync()
메서드는 다음 속성을 포함하는 ClientBulkWriteResult
객체 를 반환합니다.
속성 | 설명 |
---|---|
| Indicates whether the server acknowledged the bulk write operation. If the
value of this property is false and you try to access any other property
of the ClientBulkWriteResult object, the driver throws an exception. |
| An IReadOnlyDictionary<int, BulkWriteDeleteResult> object containing the
results of each successful delete operation, if any. |
| The number of documents deleted, if any. |
| An IReadOnlyDictionary<int, BulkWriteInsertOneResult> object containing the
results of each successful insert operation, if any. |
| The number of documents inserted, if any. |
| The number of documents matched for an update, if applicable. |
| The number of documents modified, if any. |
| An IReadOnlyDictionary<int, BulkWriteUpdateResult> object containing the
results of each successful update operation, if any. |
| The number of documents upserted, if any. |
예외 처리
대량 쓰기 (write) 작업의 작업 중 하나라도 실패하면 .NET/ C# 드라이버 는 ClientBulkWriteException
를 발생시키고 더 이상의 작업을 수행하지 않습니다.
ClientBulkWriteException
객체 에는 다음과 같은 속성이 포함되어 있습니다.
속성 | 설명 |
---|---|
| |
| The error message. Data Type: string |
| A dictionary of errors that occurred during the bulk write operation. Data Type: IReadOnlyDictionary<int, WriteError> |
| The results of any successful operations performed before the exception was thrown. Data Type: ClientBulkWriteResult |
| Write concern errors that occurred during execution of the bulk write operation. Data Type: IReadOnlyList<MongoWriteConcernException> |
|
추가 정보
개별 쓰기 작업을 수행하는 방법을 알아보려면 다음 가이드를 참조하세요.
이 가이드에서 사용되는 메서드 또는 유형에 대해 자세히 알아보려면 다음 API 설명서를 참조하세요.