前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一日一技:在 MongoDB 中,如何批量更新不同数据为不同值?

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

作者头像
青南
发布2021-06-23 01:06:09
4.3K0
发布2021-06-23 01:06:09
举报
文章被收录于专栏:未闻Code未闻Code

摄影:产品经理

家里做点简单的

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

代码语言:javascript
复制
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,你可能需要写成两条更新语句:

代码语言:javascript
复制
handler.update_many({'sex': '男', 'result': {'$lt': 90}}, {'$set': {'is_qualified': False}})

handler.update_many({'sex': '女', 'result': {'$gte': 60}}, {'$set': {'is_qualified': True}})

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

代码语言:javascript
复制
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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-06-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 未闻Code 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 参考资料
相关产品与服务
云数据库 MongoDB
腾讯云数据库 MongoDB(TencentDB for MongoDB)是腾讯云基于全球广受欢迎的 MongoDB 打造的高性能 NoSQL 数据库,100%完全兼容 MongoDB 协议,支持跨文档事务,提供稳定丰富的监控管理,弹性可扩展、自动容灾,适用于文档型数据库场景,您无需自建灾备体系及控制管理系统。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档