是mongodb原子中的upsert与过滤器和实际更新

Not*_*ple 9 c# mongodb mongodb-.net-driver

我有一个我想要插入的文档.它有一个属性的唯一索引,所以我有这样的东西,以确保我没有碰撞

var barVal = 1;

collection.UpdateOne(
     x=>x.Bar == barVal,
     new UpdateDefinitionBuilder<Foo>().Set(x=>x.Bar, barVal),  
     new UpdateOptions { IsUpsert = true });
Run Code Online (Sandbox Code Playgroud)

但我似乎有时会在条形图上的唯一索引上发生碰撞.

围绕upserts是mongo原子,所以如果过滤器匹配文档,则在更新完成之前无法更改?

如果它是我可能在其他地方有问题,如果它不是我需要处理事实不是.

文档似乎并没有暗示这是另一种方式.

https://docs.mongodb.com/v3.2/reference/method/Bulk.find.upsert/ https://docs.mongodb.com/v3.2/reference/method/db.collection.update/

Mar*_*ara 5

实际上,文档对此有所说明。这是我在db.collection.update#use-unique-indexes中找到的内容

为了避免多次插入同一文档,请仅upsert: true在查询字段具有唯一索引时使用。

...

使用唯一索引,如果多个应用程序使用 发出相同的更新upsert: true,则只有一个应用程序update()能够成功插入新文档。

其余操作将:

  • 更新新插入的文档,或者

  • 当他们尝试插入重复项时失败。如果操作由于重复索引键错误而失败,应用程序可以重试该操作,该操作将作为更新操作成功。

因此,如果您在正在查询的字段上创建了唯一索引,则可以保证插入是“原子的”,并且在发生故障时会执行某种回滚。