问题描述
如何将一个数组插入到Collection内?若item_id存在,则不插入?
例如:
item_arr = [
{'item_id': '1',
'title' : 'AAA'
},
{'item_id': '2',
'title' : 'BBB'
}
]
请问如何将item_arr插入到Collection里面,如果有记录item_id = 1 的,则只插入item_id = 2这条记录。
问题出现的环境背景及自己尝试过哪些方法
1.将数组遍历为单个,然后用pymongo的update_one方法,将选项 upsert = true, 可以解决。但遍历影响效率。请教最好一句话方法。
2.update_many,提供了upsert选项,但貌似需要指定相关条件 ?,请教。。
3.insert_many,可以一次性插入,但没有提供upsert选项。
你的方案1慢是因为变成了多次操作,每次都需要经过网络传输,对性能影响较大。相应的解决方案也有多个,取决于你的环境版本和驱动版本可采用不同的方案(具体用法请查询相应版本驱动的文档,我下面给的是pymongo 3.7的链接):
使用bulk_write方法
初始化多个update方法,然后放在一个bulk里面执行。bulk_write的文档
使用唯一索引+
insert_many
+ordered=false
insert_many
方法本质上也是bulk操作,但它较update少了搜索的部分,因此理论上更快。同时也是因为没有进行搜索就插入,它没有办法判断插入的数据是否存在,这点就需要通过
item_id
上的唯一索引来确保。同时默认情况下
insert_many
使用ordered=true
,遇到一个插入错误(item_id
重复)就停止了,所以需要ordered=false
。