Vet inte riktigt vad du vill ha. Det finns i huvudsak två typer av uppdateringar i MongoDB:du kan utföra en atomic uppdatering , eller ersätt dokumentet .
Det är ofta lättare att byta ut dokumentet , eftersom det låter dig använda standard C#-operationer för att utföra ändringar och det kommer att omvärdera genererade egenskaper och liknande:
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);
Det krävs dock ibland att man använder atomära modifierare, som $push
, $pull
, $set
, $addToSet
, etc. på grund av samtidighetsproblem. Jag anser generellt att det är en dålig idé att utföra komplexa operationer på komplexa inbäddade objekt på detta sätt, eftersom det är stor sannolikhet att objektets konsistens (i ACID-bemärkelsen, eller 'objektinvarianter' ) kan inte kontrolleras.
Anta att en användare inte ska tillåtas ha mer än 3 aktiva uppdrag åt gången, vem ser till att denna regel följs? Det är normalt kodens ansvar, och komplexa invarianter kan inte kontrolleras av databasen.
Om du fortfarande vill använda dessa atomoperatorer föreslår jag att du ställer en ny fråga eftersom det verkligen beror på detaljerna (ordboken är som standard serialiserad som ett dokument, tupeln som en array, och de kräver olika atommodifierare i MongoDB). Till exempel, för att lägga till ett nytt objekt i ordboken, använd $set
:
users.UpdateOneAsync(p => p.Id == user.Id,
Builders<User>.Update.Set("Quests.hoho Modified",
new Tuple<string, string>("B", "B-Item")));