公式
イメージ
- 繰り返し処理などで一回一回 db に接続しにいく処理があったとする。
その処理は結構大変なので、パフォーマンスが激減する。
- 例えば、洗濯物をタンスにしまうときに、
- タンスを開ける -> 洗濯物を一枚入れる -> タンスを閉める...
- この処理をその回数分繰り返しているような感じ。
- 非常に能率が悪いことがわかる。
BulkOp を使うと、
- Bulk に貯めといて、一回で db に全部入れておしまい ♪
- みたいな感じになると思っている。
一例
asyncなんかの関数(なんかの引数){(省略)// mongodb に接続してなんかの db を取得する。 今回は page としよう。constpageCollection=mongoose.connection.collection('pages');// bulk を作る。 この時点では空っぽ。。。constunorderedBulkOp=pageCollection.initializeUnorderedBulkOp();// 繰り返し処理for(leti=0;i<pages.length;i++){if(originPages[i].redirectTo!==pages[i].path){thrownewError('The new page of to revert is exists and the redirect path of the page is not the deleted page.');}// 一回 bulk に貯めとく。unorderedBulkOp.find({_id:originPages[i]._id}).remove();}//繰り返し処理が終わったら,db に接続する。try{awaitunorderedBulkOp.execute();}catch(err){(省略)
どれくらい早くなんの?
- 数十件ならばそんなに変わらない。
- 数千件になると、約1分30秒位変わる。
- つまり多ければ多いほど、この効果を実感できる。