请教:Python MongoDB插入多条记录(数组),若已经存在则不插入。

问题描述

如何将一个数组插入到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选项。


阅读 3.3k
1 个回答

你的方案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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题