Que yo sepa, mongodb conoce Dictionary como un objeto, y no puede realizar ninguna operación relacionada con la matriz. Cambié la serialización y probé con varios tipos de serialización de diccionario. pero no hay posibilidad.
así que cargo mi campo (diccionario) (todos ellos) en la memoria, lo actualizo y lo configuro de nuevo en mongodb.
¿Hay alguna forma de alterar el diccionario en mongodb con el controlador c#?
mi tipo de documento:
public class Site { public string Id { get; set; } //[BsonDictionaryOptions(DictionaryRepresentation.ArrayOfDocuments)] public Dictionary<string,string> Properties { get; set; } }mi operación de actualización:
public ServiceResult UpdateProperties(string id, Dictionary<string,string> properties) { var baseList = Collection.Find(m => m.Id == id) .Project(s => s.Properties) .FirstOrDefault(); if (baseList == null) { baseList = properties; } else { baseList.Upsert(properties); //update,insert dic by new one } var filter = Builders<Site>.Filter .Eq(m => m.Id, id); var update = Builders<Site>.Update .Set(m => m.Properties, baseList); try { Collection.UpdateOne(filter, update); return ServiceResult.Okay(Messages.ItemUpdated); } catch (Exception ex) { return ServiceResult.Exception(ex); } }Realmente aprecio cualquier ayuda que pueda proporcionar.
desambiguación:
public static class DictionaryExtensions { public static void Upsert<TKey, TValue>(this Dictionary<TKey, TValue> source, Dictionary<TKey, TValue> newOne) { foreach (var item in newOne) { source[item.Key] = item.Value; } } }Puede revisar todas las propiedades que desea actualizar/insertar y hacerlo para cada propiedad:
UpdateDefinition<Site> upsert = null; if (properties.Any()) { var firstprop = properties.First(); upsert = Builders<Site>.Update.Set(nameof(Site.Properties) + "." + firstprop.Key, firstprop.Value); foreach (var updateVal in properties.Skip(1)) { upsert = upsert.Set(nameof(Site.Properties) + "." + updateVal.Key, updateVal.Value); } collection.UpdateOne(r => r.Id == "YourId", upsert, new UpdateOptions { IsUpsert = true }); }Versión anterior de la respuesta, con múltiples actualizaciones:
foreach (var updateVal in properties) { collection.UpdateOne(r => r.Id == "YourId", Builders<Site>.Update.Set( nameof(Site.Properties)+ "." + updateVal.Key, updateVal.Value), new UpdateOptions { IsUpsert = true}); }Tenga en cuenta que eso solo agregará nuevas claves/valores o actualizará los existentes, esto no eliminará nada.