Nie wiem, czego dokładnie chcesz. W MongoDB istnieją zasadniczo dwa rodzaje aktualizacji:można wykonać atomową aktualizację lub zamień dokument .
Zastąpienie dokumentu jest często łatwiejsze , ponieważ pozwala używać standardowych operacji C# do wykonywania modyfikacji i ponownie ocenia wygenerowane właściwości i tym podobne:
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);
Jednak czasami wymagane jest użycie modyfikatorów atomowych, takich jak $push
, $pull
, $set
, $addToSet
, itp. z powodu obaw o współbieżność. Generalnie uważam, że wykonywanie w ten sposób złożonych operacji na złożonych obiektach osadzonych jest złym pomysłem, ponieważ istnieje duże prawdopodobieństwo spójności obiektu (w sensie ACID, czyli „niezmienniki obiektu” ) nie można sprawdzić.
Załóżmy, że użytkownik nie powinien mieć jednocześnie więcej niż 3 aktywnych zadań, kto zapewnia przestrzeganie tej zasady? Jest to zwykle odpowiedzialność kodu, a złożone niezmienniki nie mogą być sprawdzane przez bazę danych.
Jeśli nadal chcesz używać tych operatorów atomowych, sugeruję zadanie nowego pytania, ponieważ tak naprawdę zależy to od szczegółów (słownik domyślnie jest serializowany jako dokument, krotka jako tablica i wymagają różnych modyfikatorów atomowych w MongoDB). Na przykład, aby dodać nowy element do słownika, użyj $set
:
users.UpdateOneAsync(p => p.Id == user.Id,
Builders<User>.Update.Set("Quests.hoho Modified",
new Tuple<string, string>("B", "B-Item")));