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

时间:2016-11-24 21:12:43

标签: 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 });

但我似乎有时会在栏上的唯一索引上发生碰撞。

mongo atomic是否有upsert,所以如果过滤器匹配文档,则在更新完成之前无法更改?

如果是,我可能在其他地方遇到问题,如果不是我需要处理事实,不是。

文档似乎没有说明这是另一种方式。

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

1 个答案:

答案 0 :(得分:2)

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

中找到的内容
  

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

     

...

     

具有唯一索引,如果多个应用程序发布相同的更新   使用upsert: true,恰好一个update()会成功插入一个   新文档。

     

其余操作将是:

     
      
  • 更新新插入的文档,或

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

  •   

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