我们可能经常遇到一个问题就是会依据一定的条件去动态更新数据库的一些值,比如类似如下代码

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

文档地址,点击这里


youyu岁月
489 声望45 粉丝

不要用执行上的勤奋来掩盖思考上的懒惰