我有一个我想要插入的文档。它有一个属性的唯一索引,所以我有这样的东西,以确保我没有碰撞
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/
答案 0 :(得分:2)
实际上,文档对此有所说明。这是我在db.collection.update#use-unique-indexes
中找到的内容为避免多次插入同一文档,请仅在查询字段唯一索引时使用
upsert: true
。...
具有唯一索引,如果多个应用程序发布相同的更新 使用
upsert: true
,恰好一个update()
会成功插入一个 新文档。其余操作将是:
更新新插入的文档,或
尝试插入重复项时失败。 如果操作由于重复的索引键错误而失败, 应用程序可以重试该操作,该操作将作为更新成功 操作。
因此,如果您在查询的字段上创建了唯一索引,则可以确保插入是“原子的”,并且在发生故障时可以执行某种回滚。