正確に何が欲しいのかわからない。 MongoDBには、基本的に2種類の更新があります。アトミック更新を実行できます。 、またはドキュメントを置き換える 。
ドキュメントの置き換えは多くの場合簡単です 、標準のC#操作を使用して変更を実行でき、生成されたプロパティなどを再評価できるためです。
var user = new User { Name = "John Doe", Quests =
new Dictionary<string, Tuple<string, string>> {
{ "hoho", new Tuple<string, string>("A", "A-Item") } } };
users.InsertOneAsync(user).Wait();
user.Quests = new Dictionary<string, Tuple<string, string>> {
{ "hoho Modified", new Tuple<string, string>("B", "B-Item") } };
users.ReplaceOneAsync(p => p.Id == user.Id, user);
ただし、$push
などのアトミック修飾子を使用する必要がある場合があります 、$pull
、$set
、$addToSet
同時実行の懸念があるためなど。オブジェクトの一貫性の可能性が高いため、この方法で複雑な埋め込みオブジェクトに対して複雑な操作を実行することは一般的に悪い考えです。 (ACIDの意味で、または'object invariants' )チェックできません。
ユーザーが一度に3つを超えるアクティブなクエストを持つことを許可されるべきではないと仮定します。誰がこのルールが守られていることを確認しますか?これは通常、コードの責任であり、複雑な不変条件をデータベースでチェックすることはできません。
それでもこれらのアトミック演算子を使用したい場合は、詳細に依存するため、新しい質問をすることをお勧めします(辞書はデフォルトでドキュメントとしてシリアル化され、タプルは配列としてシリアル化され、異なるアトミック修飾子が必要です) MongoDBで)。たとえば、辞書に新しいアイテムを追加するには、$set
を使用します :
users.UpdateOneAsync(p => p.Id == user.Id,
Builders<User>.Update.Set("Quests.hoho Modified",
new Tuple<string, string>("B", "B-Item")));