如何继续使用PyMongo重复键错误后插入如何继续使用PyMongo重复键错误后插入(How to

2019-05-12 10:47发布

如果我需要在MongoDB中插入文档时,如果不存在,就

db_stock.update_one(document, {'$set': document}, upsert=True)

.will做的工作(随时纠正我,如果我错了)

但是,如果我有一个文件列表,并希望将其插入到所有这将是做这件事的最佳方式?

有此单记录的版本问题,但我需要一个连接的质量它的版本,所以它的不同。

让我改写我的问题。 我有几百万的文件,这几个已经可以存储。 如何存放剩余的MongoDB中几秒钟,而不是几分钟/小时的事?

Answer 1:

您需要使用insert_many方法,并设置命令选项False

db_stock.insert_many(<list of documents>)

作为有序选项文件中提到:

排序 (可选):如果为True(默认),文件将被插入在服务器上连续,在提供的顺序。 如果出现错误的所有剩余刀片中止。 如果为False,文件将在服务器上以任意顺序插入,可能并行,所有文件的插入会尝试。

这意味着,如果有重复键插入错误甚至会继续。

演示:

>>> c.insert_many([{'_id': 2}, {'_id': 3}])
<pymongo.results.InsertManyResult object at 0x7f5ca669ef30>
>>> list(c.find())
[{'_id': 2}, {'_id': 3}]
>>> try:
...     c.insert_many([{'_id': 2}, {'_id': 3}, {'_id': 4}, {'_id': 5}], ordered=False)
... except pymongo.errors.BulkWriteError:
...     list(c.find())
... 
[{'_id': 2}, {'_id': 3}, {'_id': 4}, {'_id': 5}]

正如你所看到的文档与_id 4,5分别插入集合。


它值得注意的是,这也有可能在使用中外壳insertMany方法。 所有你需要设置的选项,无证orderedfalse

db.collection.insertMany(
    [ 
        { '_id': 2 }, 
        { '_id': 3 },
        { '_id': 4 }, 
        { '_id': 5 }
    ],
    { 'ordered': false }
)


Answer 2:

随着bulkWrite你可以做到这一点,虽然我不知道它的pymongo命令,这里的直MongoDB的查询:

db.products.insert([
  { _id: 11, item: "pencil", qty: 50, type: "no.2" },
  { item: "pen", qty: 20 },
  { item: "eraser", qty: 25 }
])


文章来源: How to continue insertion after duplicate key error using PyMongo