Mongo的bulkWrite介紹

youyu歲月發表於2022-05-25

我們可能經常遇到一個問題就是會依據一定的條件去動態更新資料庫的一些值,比如類似如下程式碼

    updateInfo := map[string]int64{}
    for name, count := range updateInfo {
            coll.Update(bson.M{"name": name}, bson.M{"$inc": bson.M{"count": count}})
    }

這樣寫勢必會造成資料庫io壓力大,網路io多,系統處理效能下降


其實在mongodb3.2中新增了一個bulkWrite 操作,他支援我們批量的寫入,更新,刪除資料;

db.collection.bulkWrite(
   [ <operation 1>, <operation 2>, ... ],
   {
      writeConcern : <document>,
      ordered : <boolean>
   }
)

其中ordered是個需要注意的地方,根據官方描述:
預設是ture,也就是按照順序插入資料,如果中間出現錯誤則不會在繼續執行
如果是false,則mongo會採用併發的方式插入資料,中間出現錯誤對後續操作無影響


所以上面程式碼可以修改成這樣,則只要一次io就可以解決上面需要多次運算元據庫的情況

    updateInfo := map[string]int64{}

    bulk := coll.Bulk()
    for name, count := range updateInfo {
            bulk.Update(bson.M{"name": name}, bson.M{"$inc": bson.M{"count": count}})
    }
    bulk.Unordered()
    bulk.Run()

當然,在bulk中間的操作同時可以支援insert,update,upsert,delete這些命令,有需要的可以自行研究下

db.collection.bulkWrite(
   [
      { insertOne : <document> },
      { updateOne : <document> },
      { updateMany : <document> },
      { replaceOne : <document> },
      { deleteOne : <document> },
      { deleteMany : <document> }
   ],
   { ordered : false }
)

文件地址,點選這裡

相關文章