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

网友投稿 655 2023-04-05

本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。

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

我们知道,当使用 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 王晓一 男 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]。

参考资料

上一篇:服务器租用勿踩坑 安全自主不得不看
下一篇:Excel老手才知道的秘密!教你消除Excel表格密码
相关文章

 发表评论

暂时没有评论,来抢沙发吧~