sql >> Base de Datos >  >> NoSQL >> MongoDB

Actualización del diccionario en Mongodb

No estoy seguro de qué es exactamente lo que quieres. Básicamente, existen dos tipos de actualizaciones en MongoDB:puede realizar una actualización atómica , o reemplace el documento .

Reemplazar el documento suele ser más fácil , porque le permite usar operaciones estándar de C# para realizar modificaciones y volverá a evaluar las propiedades generadas y similares:

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

Sin embargo, a veces es necesario usar modificadores atómicos, como $push , $pull , $set , $addToSet , etc. debido a problemas de concurrencia. En general, considero que es una mala idea realizar operaciones complejas en objetos incrustados complejos de esta manera, porque existe una alta probabilidad de que la coherencia del objeto (en el sentido ACID, o 'objetos invariantes' ) no se puede comprobar.

Supongamos que a un usuario no se le debe permitir tener más de 3 misiones activas a la vez, ¿quién se asegura de que se cumpla esta regla? Esa es normalmente responsabilidad del código, y la base de datos no puede verificar los invariantes complejos.

Si aún desea usar esos operadores atómicos, le sugiero que haga una nueva pregunta porque realmente depende de los detalles (el diccionario, por defecto, se serializa como un documento, la tupla como una matriz y requieren diferentes modificadores atómicos en MongoDB). Por ejemplo, para agregar un nuevo elemento al diccionario, use $set :

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