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

Aggiornamento del dizionario in Mongodb

Non sono sicuro di cosa vuoi esattamente. Esistono essenzialmente due tipi di aggiornamenti in MongoDB:puoi eseguire un aggiornamento atomico oppure sostituisci il documento .

Sostituire il documento è spesso più semplice , perché consente di utilizzare le operazioni C# standard per eseguire modifiche e rivaluta le proprietà generate e simili:

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);

Tuttavia, a volte è necessario utilizzare modificatori atomici, come $push , $pull , $set , $addToSet , ecc. a causa di problemi di concorrenza. In genere ritengo una cattiva idea eseguire operazioni complesse su oggetti incorporati complessi in questo modo, perché esiste un'alta probabilità che l'oggetto sia coerenza (nel senso ACID, o 'oggetto invarianti' ) non può essere controllato.

Supponiamo che a un utente non debba essere consentito di avere più di 3 missioni attive alla volta, chi garantisce che questa regola venga rispettata? Normalmente è responsabilità del codice e le invarianti complesse non possono essere verificate dal database.

Se vuoi ancora usare quegli operatori atomici, ti suggerisco di porre una nuova domanda perché lì dipende davvero dai dettagli (il dizionario, per impostazione predefinita, è serializzato come un documento, la tupla come un array e richiedono diversi modificatori atomici in MongoDB). Ad esempio, per aggiungere un nuovo elemento al dizionario, usa $set :

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