在mongodb中,如何进行纯更新(而不是upsert)来替换整个类型的文档?

时间:2013-06-10 01:39:14

标签: c# mongodb mongodb-.net-driver

我正在尝试使用C#MongoDB驱动程序实现我们的CRUD接口。如果记录(与传入的模型具有相同的id)不存在,我们的更新方法应该抛出错误。

  • 我知道MongoCollection.Save可以根据id更新文档, 但它也会插入。我不想在任何下插入 情况。

  • 我还想避免通过指定每个来手动形成更新 构件。

  • 我也想避免两次调用mongo数据库E.g .;

    1. 检查文件是否存在。
    2. 保存(如果确实存在)。

我正在寻找尽可能接近的东西:

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,你如何用通常使用的默认值初始化它?)

是否有一些黑客方法可以做到这一点?

谢谢。

1 个答案:

答案 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);