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

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

問題描述

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

例如:

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

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

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

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

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


回答
編輯回答
筱饞貓

你的方案1慢是因?yàn)樽兂闪硕啻尾僮?,每次都需要?jīng)過網(wǎng)絡(luò)傳輸,對(duì)性能影響較大。相應(yīng)的解決方案也有多個(gè),取決于你的環(huán)境版本和驅(qū)動(dòng)版本可采用不同的方案(具體用法請(qǐng)查詢相應(yīng)版本驅(qū)動(dòng)的文檔,我下面給的是pymongo 3.7的鏈接):

使用bulk_write方法

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

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

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

2018年8月25日 17:20