1

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

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

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

  • 我也想避免两次调用 mongo 数据库。

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

有什么黑客方法可以做到吗?

谢谢你。

4

1 回答 1

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);
于 2013-06-11T08:42:47.017 回答