대량 쓰기 작업
개요
컬렉션에 문서를 삽입하고 다른 여러 문서를 업데이트한 다음 문서를 삭제하려는 시나리오를 가정해 보겠습니다. 개별 메서드를 사용하는 경우 각 작업에는 자체 데이터베이스 호출이 필요합니다. 이 가이드에서는 대량 쓰기 작업을 사용하여 단일 데이터베이스 호출로 여러 쓰기 작업을 수행하는 방법을 보여줍니다.
샘플 데이터
이 가이드 의 예제에서는 Atlas 샘플 데이터 세트 의 sample_restaurants.restaurants
컬렉션 을 사용합니다. 무료 MongoDB Atlas cluster 를 생성하고 샘플 데이터 세트를 로드하는 방법을 학습 보려면 PyMongo 시작하기 튜토리얼을 참조하세요.
쓰기 작업 정의
수행하려는 각 쓰기 작업에 대해 다음 작업 클래스 중 하나의 인스턴스를 만듭니다.
InsertOne
UpdateOne
UpdateMany
ReplaceOne
DeleteOne
DeleteMany
그런 다음 이러한 인스턴스 목록을 bulk_write()
메서드에 전달합니다.
다음 섹션에서는 이전 클래스의 인스턴스를 만들고 사용하는 방법을 보여줍니다.
삽입 작업
삽입 작업을 수행하려면 InsertOne
인스턴스 를 만들고 삽입하려는 문서 를 지정합니다.
다음 예에서는 InsertOne
인스턴스를 만듭니다.
operation = pymongo.InsertOne( { "name": "Mongo's Deli", "cuisine": "Sandwiches", "borough": "Manhattan", "restaurant_id": "1234" } )
여러 문서를 삽입하려면 각 문서 에 대해 InsertOne
인스턴스 를 만듭니다.
업데이트 작업
문서를 업데이트하려면 UpdateOne
인스턴스를 만들고 다음 인수를 전달합니다.
컬렉션의 문서를 일치시키는 데 사용되는 기준을 지정하는 쿼리 필터
수행하려는 업데이트 작업입니다. 업데이트 작업에 대한 자세한 내용은 MongoDB Server 매뉴얼의 필드 업데이트 연산자 가이드 를 참조하세요.
UpdateOne
쿼리 필터와 일치 하는 첫 번째 문서를 업데이트합니다 .
다음 예에서는 UpdateOne
인스턴스를 만듭니다.
operation = pymongo.UpdateOne( { "name": "Mongo's Deli" }, { "$set": { "cuisine": "Sandwiches and Salads" }}, )
여러 문서를 업데이트 하려면 UpdateMany
인스턴스 를 만들고 동일한 인수를 전달합니다. UpdateMany
은 쿼리 필터하다 와 일치하는 모든 문서를 업데이트합니다.
다음 예에서는 UpdateMany
인스턴스를 만듭니다.
operation = pymongo.UpdateMany( { "name": "Mongo's Deli" }, { "$set": { "cuisine": "Sandwiches and Salads" }}, )
대체 작업
바꾸기 작업은 지정된 문서의 모든 필드와 값을 제거하고 새 항목으로 바꿉니다. 바꾸기 작업을 수행하려면 ReplaceOne
의 인스턴스를 만들고 쿼리 필터와 일치하는 문서에 저장하려는 필드 및 값을 전달합니다.
다음 예에서는 ReplaceOne
인스턴스를 만듭니다.
operation = pymongo.ReplaceOne( { "restaurant_id": "1234" }, { "name": "Mongo's Pizza", "cuisine": "Pizza", "borough": "Brooklyn", "restaurant_id": "5678" } )
여러 문서를 바꾸려면 각 문서 에 대해 ReplaceOne
인스턴스 를 만들어야 합니다.
삭제 작업
문서 를 삭제 하려면 DeleteOne
인스턴스 를 만들고 삭제 하려는 문서 를 지정하는 쿼리 필터하다 를 전달합니다. DeleteOne
은 쿼리 필터하다 와 일치 하는 첫 번째 문서 만 제거합니다.
다음 예에서는 DeleteOne
인스턴스를 만듭니다.
operation = pymongo.DeleteOne({ "restaurant_id": "5678" })
여러 문서를 삭제 하려면 DeleteMany
인스턴스 를 만들고 삭제 하려는 문서 를 지정하는 쿼리 필터하다 를 전달합니다. DeleteMany
은 쿼리 필터하다 와 일치하는 모든 문서를 제거합니다.
다음 예에서는 DeleteMany
인스턴스를 만듭니다.
operation = pymongo.DeleteMany({ "name": "Mongo's Deli" })
bulk_write()
메서드 호출
수행하려는 각 작업에 대한 클래스 인스턴스 를 정의한 후 이러한 인스턴스 목록을 bulk_write()
메서드에 전달합니다. 기본값 으로 이 메서드는 목록에 정의된 순서대로 작업을 실행합니다.
다음 예시 에서는 bulk_write()
메서드를 사용하여 여러 쓰기 (write) 작업을 수행합니다.
operations = [ pymongo.InsertOne( { "name": "Mongo's Deli", "cuisine": "Sandwiches", "borough": "Manhattan", "restaurant_id": "1234" } ), pymongo.InsertOne( { "name": "Mongo's Deli", "cuisine": "Sandwiches", "borough": "Brooklyn", "restaurant_id": "5678" } ), pymongo.UpdateMany( { "name": "Mongo's Deli" }, { "$set": { "cuisine": "Sandwiches and Salads" }}, ), pymongo.DeleteOne( { "restaurant_id": "1234" } ) ] results = restaurants.bulk_write(operations) print(results)
BulkWriteResult({'writeErrors': [], 'writeConcernErrors': [], 'nInserted': 2, 'nUpserted': 0, 'nMatched': 2, 'nModified': 2, 'nRemoved': 1, 'upserted': []}, acknowledged=True)
쓰기 작업 중 하나라도 실패하면 PyMongo는 BulkWriteError
를 발생시키고 추가 작업을 수행하지 않습니다. BulkWriteError
은(는) 실패한 작업이 포함된 details
속성과 예외에 대한 세부 정보를 제공합니다.
참고
PyMongo 는 대량 작업을 실행할 때 작업이 실행 컬렉션 의 write_concern
를 사용합니다. 운전자 는 실행 순서에 관계없이 모든 작업을 시도한 후 모든 쓰기 고려 (write concern) 오류를 보고합니다.
대량 쓰기 작업 사용자 지정
bulk_write()
메서드는 선택적으로 추가 매개변수를 허용하며, 이는 대량 쓰기 작업을 구성하는 데 사용할 수 있는 옵션을 나타냅니다. 추가 옵션을 지정하지 않으면 드라이버는 대량 쓰기 작업을 사용자 지정하지 않습니다.
속성 | 설명 |
---|---|
ordered | 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.Defaults to True . |
bypass_document_validation | Specifies whether the operation bypasses document-level validation. For more
information, see Schema
Validation in the MongoDB
Server manual. Defaults to False . |
session | An instance of ClientSession . For more information, see the API
documentation. |
comment | A comment to attach to the operation. For more information, see the delete command
fields guide in the
MongoDB Server manual. |
let | A map of parameter names and values. 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. |
다음 예제에서는 ordered
옵션을 False
로 설정하여 앞의 예제에서 bulk_write()
메서드를 호출합니다.
results = restaurants.bulk_write(operations, ordered=False)
순서가 지정되지 않은 대량 쓰기 (write) 의 쓰기 (write) 작업 중 하나라도 실패하면 PyMongo 는 모든 작업을 시도한 후에만 오류를 보고합니다.
참고
순서가 지정되지 않은 대량 작업은 실행 순서가 보장되지 않습니다. 이 순서는 런타임을 최적화하기 위해 나열한 방식과 다를 수 있습니다.
반환 값
bulk_write()
메서드는 BulkWriteResult
객체 를 반환합니다. BulkWriteResult
객체 에는 다음과 같은 속성이 포함되어 있습니다.
속성 | 설명 |
---|---|
acknowledged | Indicates if the server acknowledged the write operation. |
bulk_api_result | The raw bulk API result returned by the server. |
deleted_count | The number of documents deleted, if any. |
inserted_count | The number of documents inserted, if any. |
matched_count | The number of documents matched for an update, if applicable. |
modified_count | The number of documents modified, if any. |
upserted_count | The number of documents upserted, if any. |
upserted_ids | A map of the operation's index to the _id of the upserted documents, if
applicable. |
추가 정보
개별 쓰기 작업을 수행하는 방법을 알아보려면 다음 가이드를 참조하세요.
API 문서
이 가이드에서 설명하는 메서드나 유형에 대해 자세히 알아보려면 다음 API 설명서를 참조하세요.