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

运维 数据库运维 MongoDB
update_one是更新第一条满足查询条件的数据;update_many是更新所有满足查询条件的数据。大家在使用update_many的时候,不知道有没有想过一个问题:update_many会对所有满足条件的文档更新相同的字段。

[[406228]]

我们知道,当使用 Pymongo 更新MongoDB 字段的时候,我们有两种常见的方法:

  1. handler.update_one({'name''value'}, {'$set': {'aa''bb'}}) 
  2. 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,你可能需要写成两条更新语句:

  1. handler.update_many({'sex''男''result': {'$lt': 90}}, {'$set': {'is_qualified'False}}) 
  2.  
  3. handler.update_many({'sex''女''result': {'$gte': 60}}, {'$set': {'is_qualified'True}}) 

那有没有办法只发一次请求,就同时更新两组数据呢?其实方法也是有的,就是bulk_write:

  1. import pymongo 
  2.  
  3. handler = pymongo.MongoClient().test_db.test_col 
  4.  
  5. handler.bulk_write([ 
  6.   pymongo.UpdateMany({'sex''男''result': {'$lt': 90}}, {'$set': {'is_qualified'False}}), 
  7.   pymongo.UpdateMany({'sex''女''result': {'$gte': 60}}, {'$set': {'is_qualified'True}}) 
  8. ]) 

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
相关推荐

2021-07-27 21:32:57

Python 延迟调用

2021-06-08 21:36:24

PyCharm爬虫Scrapy

2022-03-12 20:38:14

网页Python测试

2021-04-12 21:19:01

PythonMakefile项目

2021-10-15 21:08:31

PandasExcel对象

2020-12-11 06:30:00

工具分组DataFrame

2021-01-08 05:17:16

重复值JSON爬虫

2021-09-13 20:38:47

Python链式调用

2021-03-12 21:19:15

Python链式调用

2023-10-28 12:14:35

爬虫JavaScriptObject

2022-06-28 09:31:44

LinuxmacOS系统

2024-07-30 08:11:16

2024-07-30 08:16:18

Python代码工具

2024-11-11 00:38:13

Mypy静态类型

2021-05-08 19:33:51

移除字符零宽

2021-04-27 22:15:02

Selenium浏览器爬虫

2022-08-26 09:34:19

单元测试代码项目

2022-06-09 21:34:41

Python代码函数

2022-03-07 09:14:04

Selenium鼠标元素

2020-05-19 13:55:38

Python加密密码
点赞
收藏

51CTO技术栈公众号