[[406228]]
我们知道,同数当使用 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 中有如下数据:
sid | name | sex | result | is_qualified |
---|---|---|---|---|
1 | 王晓一 | 男 | 80 | true |
2 | 张小二 | 女 | 69 | false |
3 | 刘小三 | 男 | 76 | false |
4 | 朱小四 | 女 | 75 | true |
5 | 马小五 | 男 | 50 | false |
6 | 赵小六 | 女 | 77 | true |
7 | 钱小七 | 男 | 60 | false |
8 | 孙小八 | 女 | 68 | false |
9 | 李小九 | 男 | 98 | true |
10 | 周小十 | 女 | 61 | false |
假设这是一份成绩表,一开始,要求男生不低于80分,女生不低于70分,is_qualified字段才会为True。后来改了计分规则,变成男生不低于90分,女生不低于60分,is_qualified就能为 True,否则为 False。所以现在需要批量更新数据。显然,对男生而言,有一些原本为True的需要变成 False;对女生而言,有一些原本为 False 的,要变成 True。如果让你直接使用update_many,你可能需要写成两条更新语句:
- handler.update_many({ 'sex': '男', 'result': { '$lt': 90}}, { '$set': { 'is_qualified': False}})
- handler.update_many({ 'sex': '女', 'result': { '$gte': 60}}, { '$set': { 'is_qualified': True}})
那有没有办法只发一次请求,就同时更新两组数据呢?其实方法也是有的,就是bulk_write:
- import pymongo
- handler = pymongo.MongoClient().test_db.test_col
- handler.bulk_write([
- pymongo.UpdateMany({ 'sex': '男', 'result': { '$lt': 90}}, { '$set': { 'is_qualified': False}}),
- pymongo.UpdateMany({ 'sex': '女', 'result': { '$gte': 60}}, { '$set': { 'is_qualified': True}})
- ])
bulk_write接收一个列表作为参数。这个列表里面的每一个元素是一个pymongo.X对象,这里的 X 可能是InsertOne/InsertMany/DeleteOne/DeleteMany/UpdateOne/ UpdateMany……,基本上就是你想使用的对应操作的驼峰命名法形式。
这种方式,Pymongo 会在一次请求同时提交这两组操作,减少网络连接的时间消耗。
批量操作不仅支持UpdateOne,还支持各种其他操作,你可以阅读Bulk Write Operations — PyMongo 3.11.4 documentation[1]。
参考资料
[1]Bulk Write Operations — PyMongo 3.11.4 documentation: https://pymongo.readthedocs.io/en/stable/examples/bulk.html
责任编辑:武晓燕 来源: 未闻Code MongoDB数据
(责任编辑:休闲)
阳普医疗(300030.SZ)公布消息:赵吉庆已于3月17日
新增专项债已发行3.55万亿元 对稳定经济增长发挥出关键作用
海关总署:前10月中美贸易总值3.95万亿元 对东盟出口2.5万亿元
5月3日沪深两市最新交易提示 华能国际等101股召开股东大会
年内A股IPO募资为近10年新高 科创板创业板合计占比超六成