如果我需要在MongoDB中插入文档时,如果不存在,就
db_stock.update_one(document, {'$set': document}, upsert=True)
.will做的工作(随时纠正我,如果我错了)
但是,如果我有一个文件列表,并希望将其插入到所有这将是做这件事的最佳方式?
有此单记录的版本问题,但我需要一个连接的质量它的版本,所以它的不同。
让我改写我的问题。 我有几百万的文件,这几个已经可以存储。 如何存放剩余的MongoDB中几秒钟,而不是几分钟/小时的事?
您需要使用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
方法。 所有你需要设置的选项,无证ordered
给false
。
db.collection.insertMany(
[
{ '_id': 2 },
{ '_id': 3 },
{ '_id': 4 },
{ '_id': 5 }
],
{ 'ordered': false }
)
随着bulkWrite
你可以做到这一点,虽然我不知道它的pymongo命令,这里的直MongoDB的查询:
db.products.insert([
{ _id: 11, item: "pencil", qty: 50, type: "no.2" },
{ item: "pen", qty: 20 },
{ item: "eraser", qty: 25 }
])