我们知道在使用Pymongo更新MongoDB字段的时候,我们有两个常用的方法:handler.update_one({'name':'value'},{'$set':{'aa':'bb'}})handler.update_many({'name':'value'},{'$set':{'aa':'bb'}})其中update_one是更新第一个满足查询条件的数据;update_many是更新所有符合查询条件的数据。大家在使用update_many的时候,不知道大家有没有想过一个问题:update_many会对所有满足条件的文档更新相同的字段。比如上面第二行代码,所有name字段为value的数据,更新后,新数据的aa字段的值都是bb。那么,有没有办法把不同的字段一次更新成不同的数据呢?比如我们的MongoDB中有如下数据:sidnamesexresultis_qualified1王小义男80true2张小二女69false3刘小三男76false4朱小四75true5马小五50false6赵小六77true7钱小七60假8孙小八68假9李小九98真10Weeks10girls61false假设这是一张成绩单,一开始要求男生不低于80分,女生不低于70分,所以is_qualified字段会为True。如果分数低于90分且女生分数不低于60分,则is_qualified为True,否则为False。所以现在需要批量更新数据。显然,对于男生来说,有些本来是True的东西需要变成False;对于女孩子来说,有些本来是假的东西,需要变成真。如果直接使用update_many,可能需要写两条update语句:handler.update_many({'sex':'male','result':{'$lt':90}},{'$set':{'is_qualified':False}})handler.update_many({'sex':'female','result':{'$gte':60}},{'$set':{'is_qualified':True}})是有没有办法通过只发送一个请求来同时更新两组数据?其实还有一个方法,就是bulk_write::90}},{'$set':{'is_qualified':False}}),pymongo.UpdateMany({'sex':'female','result':{'$gte':60}},{'$set':{'is_qualified':True}})])bulk_write接受一个列表作为参数。此列表中的每个元素都是一个pymongo.X对象,其中X可能是InsertOne/InsertMany/DeleteOne/DeleteMany/UpdateOne/UpdateMany...,这基本上是您要使用的相应操作的驼峰式大小写。这样Pymongo会在一个请求中同时提交这两组操作,减少了网络连接的时间消耗。Bulk操作不仅支持UpdateOne,还支持其他各种操作,可以阅读BulkWriteOperations—PyMongo3.11.4文档[1]。参考资料[1]批量写入操作——PyMongo3.11.4文档:https://pymongo.readthedocs.io/en/stable/examples/bulk.html
