1

C# MongoDB ドライバーを使用して CRUD インターフェイスを実装しようとしています。update メソッドは、(渡されたモデルと同じ ID を持つ) レコードが存在しない場合、エラーをスローすることになっています。

  • MongoCollection.Save が ID に基づいてドキュメントを更新できることは知っていますが、挿入も行います。どうしても入れたくない。

  • また、すべてのメンバーを指定して手動で更新を作成することも避けたいと考えています。

  • また、mongo データベースを 2 回呼び出すことも避けたいと思います。

    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 では、 on のメソッドによって置換が実現されるようになりましたIMongoCollection

await myCollection.ReplaceOneAsync(m => m.Id == myModel.Id, myModel);
于 2013-06-11T08:42:47.017 に答える