我正在尝试使用C#MongoDB驱动程序实现我们的CRUD接口。如果记录(与传入的模型具有相同的id)不存在,我们的更新方法应该抛出错误。
我知道MongoCollection.Save可以根据id更新文档, 但它也会插入。我不想在任何下插入 情况。
我还想避免通过指定每个来手动形成更新 构件。
我也想避免两次调用mongo数据库E.g .;
我正在寻找尽可能接近的东西:
var result = myCollection.Update(myModel, WriteConcern.Acknowledged);
//result will have an error if a document with Id==myModel.Id did not pre-exist
我也会对类似的事情感到满意:
var query = Query<MyModel>.EQ(m => m.Id, myModel.Id);
var update = Update<MyModel>.SetDocument(myModel);
var result = myCollection.Update(query, update, WriteConcern.Acknowledged);
有没有“正确”的方法来做到这一点?如果没有,那么我应该使用Mongo DB,以什么令人难以置信的替代模式'CRUD my models'?
我可以在MongoInsertOptions中设置一些东西来实现这个目标(顺便说一句,如果你创建自己的MongoInsertOptions,你如何用通常使用的默认值初始化它?)
是否有一些黑客方法可以做到这一点?
谢谢。
答案 0 :(得分:4)
Replace
您要找的是什么?
var query = Query<MyModel>.EQ(m => m.Id, myModel.Id);
var update = Update<MyModel>.Replace(myModel);
var result = myCollection.Update(query, update, WriteConcern.Acknowledged);
http://api.mongodb.org/csharp/current/?topic=html/5e30d03f-b26a-3840-ce84-222f9804ca92.htm
正如Asya所说,除非您明确使用UpdateFlags.Upsert
,否则不会执行插入。
<强>更新强>
在MongoDB C#Driver 2.x中,现在通过IMongoCollection
上的方法实现替换。
await myCollection.ReplaceOneAsync(m => m.Id == myModel.Id, myModel);