MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Mise à jour du dictionnaire dans Mongodb

Vous ne savez pas exactement ce que vous voulez. Il existe essentiellement deux types de mises à jour dans MongoDB :vous pouvez effectuer une mise à jour atomique , ou remplacer le document .

Remplacer le document est souvent plus facile , car il vous permet d'utiliser des opérations C# standard pour effectuer des modifications et il réévaluera les propriétés générées et autres :

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

Cependant, il est parfois nécessaire d'utiliser des modificateurs atomiques, comme $push , $pull , $set , $addToSet , etc. en raison de problèmes de concurrence. Je considère généralement que c'est une mauvaise idée d'effectuer des opérations complexes sur des objets intégrés complexes de cette façon, car il y a une forte probabilité que la cohérence de l'objet (au sens ACID, ou 'invariants d'objets' ) ne peut pas être vérifié.

Supposons qu'un utilisateur ne soit pas autorisé à avoir plus de 3 quêtes actives à la fois, qui s'assure que cette règle est respectée ? C'est normalement la responsabilité du code, et les invariants complexes ne peuvent pas être vérifiés par la base de données.

Si vous souhaitez toujours utiliser ces opérateurs atomiques, je vous suggère de poser une nouvelle question car là, cela dépend vraiment des détails (le dictionnaire, par défaut, est sérialisé en tant que document, le tuple en tant que tableau, et ils nécessitent différents modificateurs atomiques dans MongoDB). Par exemple, pour ajouter un nouvel élément au dictionnaire, utilisez $set :

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