暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

一日一技:在 MongoDB 中,如何批量更新不同数据为不同值?

未闻Code 2021-06-22
5539

摄影:产品经理
家里做点简单的

我们知道,当使用 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_qualified
1王晓一80true
2张小二69false
3刘小三76false
4朱小四75true
5马小五50false
6赵小六77true
7钱小七60false
8孙小八68false
9李小九98true
10周小十61false

假设这是一份成绩表,一开始,要求男生不低于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技术交流群开放啦!群里既有国内一二线大厂在职员工,也有国内外高校在读学生,既有十多年码龄的编程老鸟,也有中小学刚刚入门的新人,学习氛围良好!想入群的同学,请添加我的微信“mekingname”,备注“粉丝群”(谢绝广告党,非诚勿扰!)~


文章转载自未闻Code,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论