1

更新後/更新前に更新されたコレクションを取得する方法はありますか? 私が考えることができるのはかなり重いです。

  1. フィルターを使用して更新したいものを取得します。
  2. 以前の状態で取得したすべてを更新します
  3. もう一度 ID ですべて取得し、何が更新されたかを確認します。

なぜこれが必要なのですか?

データベースから常にデータをフェッチするサービスがあります。ステータスに応じてアトミックに取得したい。

たとえば、フィールド Status を含むドキュメントのステータスが 1 の場合、サービスでそれをフェッチし、プロセスでアトミックに 2 に変更する必要があるため、他のすべてのコンポーネントが何らかの理由で私をオーバーライドすることはありません。

更新は次のようになります。

var filter = Builders<ServiceModel>.Filter.And(
                                                                Builders<ServiceModel>.Filter.Gt(t => t.EndDate, dueDate),
                                                                Builders<ServiceModel>.Filter.Eq(t => t.Status, Enums.ServiceHandleStatus.Registered));

            var update = Builders<ServiceModel>.Update.Set(t => t.Status, Enums.ServiceHandleStatus.InProcess);

            var options = new UpdateOptions() { IsUpsert = false };

            using (var result = this.manager.Trainings.UpdateManyAsync(filter, update, options))

方向性は?

ティア。

4

1 に答える 1

2

このような mongodb での唯一のアトミックな更新は、.NET で FindOneAndUpdate として提供される findAndModify を使用することです。そのため、やりたいことができますが、一度に 1 つのドキュメントしかできません。

アップデート

複数のリクエストを作成しても問題ない場合は、UpdateMany を使用して 2 つのリクエストでこれを行うことができ、単に InProcess としてマークする代わりに、どのプロセスがそれらを処理しているかを示すこともできます。次に、後続のクエリを作成して戻ってきて、現在のプロセスの InProcess になっているものをすべてプルすることができます。

これに関する唯一の問題は、10、20、または 10K のみを更新するように指定できないことです。つまり、複数の「プロセッサ」にスケールアウトできないということです。それらすべてを更新することになるからです。

于 2016-01-20T20:46:34.243 に答える