본문 바로가기
Database

MongoDB - bulkWrite() 를 이용한 대량 쓰기 작업 처리

by devLog by Ronnie's 2023. 2. 18.

데이터의 싱크 맞추는 작업을 하기 위해 몽고디비에서 지원하는 bulkWrite 기능을 이용해서 작업하여 bulkWrite 대해서 정리한다

 

MongoDB - bulkWrite() 를 이용한 대량 쓰기 작업 처리

 

MongoDB - bulkWrite() 를 이용한 대량 쓰기 작업 처리

 

bulkWrite


몽고디비에서 제공하는 bulkWrite()을 이용하면 단일 컬렉션에 대해서 대량 쓰기 작업 뿐만 아니라 업데이트 및 삭제 작업도 수행이 가능하다. (대량 삽입만이라면 isertMany()도 이용 가능)

 

bulkWrite 기능을 이용할 때는 주의점이 있는데 bulkWrite 작업 시 방식이 두가지가 존재한다는 점이다.

 

첫번째로는 Ordered 방식으로 순서가 존재하는 작업 목록이고 두번째로는 그 반대인 Unordered 방식으로 순서가 존재하지 않는 방식이다.

 

Ordered 방식은 순서가 존재하므로 작업을 순차적으로 실행하며, 작업 도중에 오류가 발생하게 되면 이후의 작업은 실행하지 않고 반환하게 된다. 

 

Unordered 방식은 정렬되지 않은 작업 목록을 병렬로 실행이 가능하지만 도중에 오류가 발생하더라도 나머지 작업을 계속 실행한다.

 

기본적으로는 ordered 방식을 사용하며 Ordered 방식은 당연히 Unordered 방식보다 처리 속도는 느리다. (방식을 지정하게 위해서는 Unordered 방식을 사용하기 위해서는 ordered : false 옵션을 주면 된다.)

bulkWrite 는 위에서 보이는 것과 같이 6개의 쓰기 작업을 지원한다.

 

  • insertOne
  • updateOne
  • updateMany
  • replaceOne
  • deleteOne
  • deleteMany

테스트


먼저 테스트를 진행하기 위해 몽고 디비에 컬렉션을 만들어 주고 다음 데이터를 생성해준다. (예제는 MongoDB 문서 예제 이용.)

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 }
] )

3개의 데이터가 추가된 것을 확인할 수 있다.

자 이제 bulkWrite()를 통해서 데이터를 추가하고 수정하고 삭제하고 replace를 통해 바꾸는 것을 테스트해보자.

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 )
}

결과를 보면 id 3, 4가 insertOne을 통해 추가가 되고 cheese 인 데이터는 7에서 8로 updateOne을 통해 수정이 되었다.

id 0번이었던 peperoni는 deleteOne을 통해 삭제가 되고 type vegan은 replaceOne을 통해 타입 사이즈 가격이 변경되었다.

쿼리문이 실행이 완료됨과 동시에 완료된 작업의 요약을 포함하는 결과물도 출력해서 보여준다.

 

 

자 여기까지는 기본적인 bulkWirte에서 제공하는 기능을 이용해서 데이터 테스트였고 다음은 Ordered와 Unorderd 설정의 따라 정말 의 옵션 설정 시 위에서 정리했던 대로 잘 동작하는지 확인해보자.

 

Ordered와 Unorderd 테스트


위에서 bulkWrite를 통해서 데이터를 변경하였을 때는 ordered 와 관련 된 옵션을 주지 않았기에 기본값이 ordered 방식이기에 순차적으로 실행되어 들어갔을 것이다. 확인을 위해서 3번째로 실행하는 updateOne의 대한 데이터만 price 8 에서 9로 변경 후 sql문을 실행해보자.

 

ordered true인 경우는 첫번째인 insertOne 이 먼저 동작하므로 _id 3번이 이미 있기에 중복 오류가 발생할 것이다.

'

바로 에러가 나는 것을 확인할 수 있다. 그럼 이번에는 ordered 옵션을 false로 변경 후 실행해보자.

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: 9 } } // 순차적으로 실행되지 않은 것을 확인하기 위해 값 변경
      } },
      { deleteOne: { filter: { type: "pepperoni"} } },
      { replaceOne: {
         filter: { type: "vegan" },
         replacement: { type: "tofu", size: "small", price: 4 }
      } }
   ], { ordered : false } ) // 옵션 추가!
} catch( error ) {
   print( error )
}

다음 sql문을 실행해보면 동일하게 에러가 발생하지만 병렬 처리가 되어 동작하므로 updateOne이 실행되어 데이터가 변경되는 것을 확인 할 수 있다.

위에 특성을 이용하고 처리해야 되는 데이터의 상황에 따라 알맞게 처리하면 된다.

 

참고


https://www.mongodb.com/docs/manual/core/bulk-write-operations/#bulkwrite---methods

 

Bulk Write Operations — MongoDB Manual

Docs Home → MongoDB Manual MongoDB provides clients the ability to perform write operations in bulk. Bulk write operations affect a single collection. MongoDB allows applications to determine the acceptable level of acknowledgement required for bulk writ

www.mongodb.com

 

댓글