Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 如何处理Mongo中的并行upsert错误?_Mongodb - Fatal编程技术网

Mongodb 如何处理Mongo中的并行upsert错误?

Mongodb 如何处理Mongo中的并行upsert错误?,mongodb,Mongodb,在我们的项目中,有一种变通方法,可以在两个线程执行upsert时处理重复密钥错误: try: await db.collection.find_one_and_update(query, update, upsert=True) except pymongo.errors.DuplicateKeyError: await db.collection.find_one_and_update(query, update, upsert=True) 它工作正常,但也许有更好的方法?此

在我们的项目中,有一种变通方法,可以在两个线程执行upsert时处理重复密钥错误:

try:
    await db.collection.find_one_and_update(query, update, upsert=True)
except pymongo.errors.DuplicateKeyError:
    await db.collection.find_one_and_update(query, update, upsert=True)

它工作正常,但也许有更好的方法?此外,为什么会发生此错误?为什么Mongo本身无法处理它(在一个查询中插入,在另一个查询中更新),而我们必须在应用程序代码中进行处理?

据我所知,之所以会发生这种情况,是因为MongoDB将查询提交到存储引擎(insert),因为在同一时刻找不到文档(不在索引中)。因此,它执行了2次插入,其中一次失败。请参阅此处的官方声明:。我建议您更改应用程序设计,在应用程序执行更新操作之前创建(空)文档。感谢您的解释和链接。嗯,我想我们有一些可以重写的查询,但有些不能。我们将对此进行考虑。请注意,此行为将在即将发布的MongoDB 4.2中得到改进,如以下所述:。如果这样做是安全的,那么在4.2中会自动重试。据我所知,这是因为MongoDB将查询提交到存储引擎(insert),因为在同一时刻找不到文档(不在索引中)。因此,它执行了2次插入,其中一次失败。请参阅此处的官方声明:。我建议您更改应用程序设计,在应用程序执行更新操作之前创建(空)文档。感谢您的解释和链接。嗯,我想我们有一些可以重写的查询,但有些不能。我们将对此进行考虑。请注意,此行为将在即将发布的MongoDB 4.2中得到改进,如以下所述:。如果这样做是安全的,在4.2中会自动重试。