Nejste si jisti, co přesně chcete. V MongoDB jsou v podstatě dva typy aktualizací:můžete provést atomovou aktualizaci nebo nahraďte dokument .
Nahrazení dokumentu je často jednodušší , protože umožňuje používat k provádění úprav standardní operace C# a přehodnocuje vygenerované vlastnosti a podobně:
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);
Někdy je však nutné použít atomické modifikátory, jako je $push
, $pull
, $set
, $addToSet
atd. kvůli obavám ze souběžnosti. Obecně považuji za špatný nápad provádět složité operace na složitých vložených objektech tímto způsobem, protože existuje vysoká pravděpodobnost konzistence objektu. (ve smyslu ACID neboli 'objektové invarianty' ) nelze zkontrolovat.
Předpokládejme, že by uživateli nemělo být povoleno mít více než 3 aktivní úkoly najednou, kdo zajišťuje dodržování tohoto pravidla? To je obvykle odpovědností kódu a komplexní invarianty nemůže databáze kontrolovat.
Pokud stále chcete používat tyto atomické operátory, doporučuji vám položit novou otázku, protože tam opravdu záleží na detailech (slovník je ve výchozím nastavení serializován jako dokument, n-tice jako pole a vyžadují různé atomické modifikátory v MongoDB). Například pro přidání nové položky do slovníku použijte $set
:
users.UpdateOneAsync(p => p.Id == user.Id,
Builders<User>.Update.Set("Quests.hoho Modified",
new Tuple<string, string>("B", "B-Item")));