sql >> Database teknologi >  >> NoSQL >> MongoDB

Opdatering af ordbog i Mongodb

Ikke sikker på, hvad du præcist vil have. Der er grundlæggende to typer opdateringer i MongoDB:du kan udføre en atomisk opdatering , eller erstat dokumentet .

Det er ofte nemmere at udskifte dokumentet , fordi det giver dig mulighed for at bruge standard C#-operationer til at udføre ændringer, og det vil revurdere genererede egenskaber og lignende:

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 er dog nogle gange nødvendigt at bruge atomare modifikatorer, såsom $push , $pull , $set , $addToSet osv. på grund af samtidighedsproblemer. Jeg anser det generelt for en dårlig idé at udføre komplekse operationer på komplekse indlejrede objekter på denne måde, fordi der er stor sandsynlighed for, at objektets konsistens (i ACID-forstand eller 'objektinvarianter' ) kan ikke kontrolleres.

Antag, at en bruger ikke skal have mere end 3 aktive quests ad gangen, hvem sikrer, at denne regel overholdes? Det er normalt kodens ansvar, og komplekse invarianter kan ikke kontrolleres af databasen.

Hvis du stadig vil bruge disse atomoperatorer, foreslår jeg, at du stiller et nyt spørgsmål, fordi det der virkelig afhænger af detaljerne (ordbogen er som standard serialiseret som et dokument, tuplen som en matrix, og de kræver forskellige atommodifikatorer i MongoDB). For eksempel, for at tilføje et nyt element til ordbogen, skal du bruge $set :

users.UpdateOneAsync(p => p.Id == user.Id, 
  Builders<User>.Update.Set("Quests.hoho Modified", 
     new Tuple<string, string>("B", "B-Item")));



  1. Kæmpe forsinkelse ved brug af Selleri + Redis

  2. Betinget $sum i MongoDB

  3. få en python docker container til at interagere med en redis docker container

  4. Er der en måde at flushall på en klynge, så alle nøgler fra master og slaver slettes fra db