一日一技:在 MongoDB 中,如何批量更新不同數(shù)據(jù)為不同值?

      網(wǎng)友投稿 1564 2025-03-31

      我們知道,當(dāng)使用 Pymongo 更新MongoDB 字段的時(shí)候,我們有兩種常見(jiàn)的方法:


      handler.update_one({'name': 'value'}, {'$set': {'aa': 'bb'}}) handler.update_many({'name': 'value'}, {'$set': {'aa': 'bb'}})

      其中,update_one是更新第一條滿足查詢條件的數(shù)據(jù);update_many是更新所有滿足查詢條件的數(shù)據(jù)。大家在使用update_many的時(shí)候,不知道有沒(méi)有想過(guò)一個(gè)問(wèn)題:update_many會(huì)對(duì)所有滿足條件的文檔更新相同的字段。例如,對(duì)于上面第二行代碼,所有name字段為value的數(shù)據(jù),在更新以后,新的數(shù)據(jù)的aa字段的值全都是bb。那么,有沒(méi)有辦法一次性把不同的字段更新成不同的數(shù)據(jù)呢?

      例如,我們的 MongoDB 中有如下數(shù)據(jù):

      假設(shè)這是一份成績(jī)表,一開始,要求男生不低于80分,女生不低于70分,is_qualified字段才會(huì)為True。后來(lái)改了計(jì)分規(guī)則,變成男生不低于90分,女生不低于60分,is_qualified就能為 True,否則為 False。所以現(xiàn)在需要批量更新數(shù)據(jù)。顯然,對(duì)男生而言,有一些原本為True的需要變成 False;對(duì)女生而言,有一些原本為 False 的,要變成 True。如果讓你直接使用update_many,你可能需要寫成兩條更新語(yǔ)句:

      一日一技:在 MongoDB 中,如何批量更新不同數(shù)據(jù)為不同值?

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

      那有沒(méi)有辦法只發(fā)一次請(qǐng)求,就同時(shí)更新兩組數(shù)據(jù)呢?其實(shí)方法也是有的,就是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接收一個(gè)列表作為參數(shù)。這個(gè)列表里面的每一個(gè)元素是一個(gè)pymongo.X對(duì)象,這里的 X 可能是InsertOne/InsertMany/DeleteOne/DeleteMany/UpdateOne/?UpdateMany……,基本上就是你想使用的對(duì)應(yīng)操作的駝峰命名法形式。

      這種方式,Pymongo 會(huì)在一次請(qǐng)求同時(shí)提交這兩組操作,減少網(wǎng)絡(luò)連接的時(shí)間消耗。

      批量操作不僅支持UpdateOne,還支持各種其他操作,你可以閱讀Bulk Write Operations — PyMongo 3.11.4 documentation[1]。

      參考資料

      MongoDB

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:Excel表格怎么統(tǒng)計(jì)符合多個(gè)條件的單元格數(shù)量?
      下一篇:【愚公系列】2021年12月 網(wǎng)絡(luò)工程-NTFS安全權(quán)限
      相關(guān)文章
      亚洲精品国产第一综合99久久| 久久久久亚洲AV无码专区桃色| 亚洲伊人久久成综合人影院| 亚洲小说图区综合在线| 久久精品国产亚洲AV天海翼| 亚洲av第一网站久章草| 中文日韩亚洲欧美制服| 亚洲最大福利视频| 亚洲乱码中文论理电影| 亚洲国产精品乱码在线观看97| 亚洲午夜精品一区二区公牛电影院 | 豆国产96在线|亚洲| 亚洲丶国产丶欧美一区二区三区| 中中文字幕亚洲无线码| 亚洲第一成年人网站| 亚洲一卡二卡三卡| 2019亚洲午夜无码天堂| 亚洲看片无码在线视频| 91情国产l精品国产亚洲区 | 爱爱帝国亚洲一区二区三区| 337P日本欧洲亚洲大胆精品| 亚洲成aⅴ人片久青草影院| 亚洲国产成人爱av在线播放| 久久久久亚洲?V成人无码| 国产亚洲成AV人片在线观黄桃| 亚洲av中文无码乱人伦在线咪咕| 亚洲国产精品久久久久网站| 亚洲网站免费观看| 亚洲一区动漫卡通在线播放| 亚洲熟妇av午夜无码不卡| 337p日本欧洲亚洲大胆人人| 亚洲一区二区三区无码影院| 亚洲精品自产拍在线观看| 亚洲狠狠综合久久| 亚洲一区二区久久| 欧美日韩亚洲精品| 国产亚洲AV手机在线观看 | 久久精品国产69国产精品亚洲| 亚洲视频中文字幕| 国产亚洲AV夜间福利香蕉149| 亚洲不卡无码av中文字幕|