在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Python  數(shù)據(jù)庫/ 請教:Python MongoDB插入多條記錄(數(shù)組),若已經(jīng)存在則不插入。

請教:Python MongoDB插入多條記錄(數(shù)組),若已經(jīng)存在則不插入。

問題描述

如何將一個數(shù)組插入到Collection內(nèi)?若item_id存在,則不插入?

例如:

item_arr = [
    {'item_id': '1',
     'title' : 'AAA'
    },
    {'item_id': '2',
     'title' : 'BBB'
    }
]

請問如何將item_arr插入到Collection里面,如果有記錄item_id = 1 的,則只插入item_id = 2這條記錄。

問題出現(xiàn)的環(huán)境背景及自己嘗試過哪些方法

1.將數(shù)組遍歷為單個,然后用pymongo的update_one方法,將選項 upsert = true, 可以解決。但遍歷影響效率。請教最好一句話方法。

2.update_many,提供了upsert選項,但貌似需要指定相關(guān)條件 ?,請教。。
       
3.insert_many,可以一次性插入,但沒有提供upsert選項。


回答
編輯回答
筱饞貓

你的方案1慢是因為變成了多次操作,每次都需要經(jīng)過網(wǎng)絡(luò)傳輸,對性能影響較大。相應(yīng)的解決方案也有多個,取決于你的環(huán)境版本和驅(qū)動版本可采用不同的方案(具體用法請查詢相應(yīng)版本驅(qū)動的文檔,我下面給的是pymongo 3.7的鏈接):

使用bulk_write方法

初始化多個update方法,然后放在一個bulk里面執(zhí)行。bulk_write的文檔

使用唯一索引+insert_many+ordered=false

insert_many方法本質(zhì)上也是bulk操作,但它較update少了搜索的部分,因此理論上更快。
同時也是因為沒有進(jìn)行搜索就插入,它沒有辦法判斷插入的數(shù)據(jù)是否存在,這點(diǎn)就需要通過item_id上的唯一索引來確保。
同時默認(rèn)情況下insert_many使用ordered=true,遇到一個插入錯誤(item_id重復(fù))就停止了,所以需要ordered=false。

2018年8月25日 17:20