Pymongo:insert_many +唯一索引

时间:2017-06-17 22:48:06

标签: mongodb python-3.x mongodb-query pymongo

我想收集我的收藏中的insert_many()个文件。其中一些可能与集合中的现有文档具有相同的键/值对(在我的示例中为screen_name)。我在此密钥上设置了唯一的索引,因此出现错误。

my_collection.create_index("screen_name", unique = True)

my_collection.insert_one({"screen_name":"user1", "foobar":"lalala"})
# no problem

to_insert = [
    {"screen_name":"user1", "foobar":"foo"}, 
    {"screen_name":"user2", "foobar":"bar"}
]
my_collection.insert_many(to_insert)

# error : 
# File "C:\Program Files\Python\Anaconda3\lib\site-packages\pymongo\bulk.py", line 331, in execute_command 
# raise BulkWriteError(full_result)
# 
# BulkWriteError: batch op errors occurred

我想:

  1. 没有错误
  2. 不更改现有文档(此处为{"screen_name":"user1", "foobar":"lalala"}
  3. 插入所有尚未存在的文档(此处为{"screen_name":"user2", "foobar":"bar"}
  4. 编辑:正如有人在评论中所说的那样,这个问题是询问如何进行批量插入并忽略唯一索引错误,同时仍然插入成功的记录。因此,如何批量插入"这个问题并不重复。请重新打开它。

2 个答案:

答案 0 :(得分:8)

一种解决方案可能是使用ordered的{​​{1}}参数并将其设置为insert_many(默认为False):

True

From the PyMongo documentation:

  

已订购(可选):如果将插入my_collection.insert_many(to_insert, ordered=False) (默认)文档   在服务器上按顺序,按提供的顺序。如果全部发生错误   剩余的插入被中止。如果True,将插入文档   服务器的任意顺序,可能并行,和所有文件   将尝试插入。

尽管如此,当所有文件都无法插入时,您仍然需要处理异常。

根据您的使用情况,您可以决定False,记录警告或检查异常。

答案 1 :(得分:0)

ordered=False 仍然有效。 Pymongo documentation 仍然表示“文档将按任意顺序插入服务器,可能是并行的,并且将尝试所有文档插入。”