Estoy usando el controlador MongoDB .Net en mi proyecto. Quiero actualizar todas las propiedades de mi objeto que está almacenado en MongoDB. En la documentación, la actualización se muestra así:
var filter = Builders<BsonDocument>.Filter.Eq("i", 10); var update = Builders<BsonDocument>.Update.Set("i", 110); await collection.UpdateOneAsync(filter, update); Pero no quiero llamar al método Set para todas las propiedades, ya que hay muchas propiedades y puede haber muchas más en el futuro.
¿Cómo puedo actualizar todo el objeto usando el controlador MongoDB .Net?
Puede hacerlo con ReplaceOneAsync en lugar de UpdateOneAsync .
Necesita un filtro para que coincida con el documento existente (un filtro con la identificación del documento es el más simple) y el nuevo objeto.
Hamster hamster = ... var replaceOneResult = await collection.ReplaceOneAsync( doc => doc.Id == hamster.Id, hamster);var update = new BsonDocument("$set", new BsonDocument(entityType.GetProperties().Where(p => p.Name != "Id").Select(p => new KeyValuePair<string, object>(p.Name, entityType.GetProperty(p.Name).GetValue(task, null))))); var options = new UpdateOptions(); collection.UpdateOne<MyTask>(item => item.Name == "cheque", update, options); este código usa la reflexión para incluir todas las propiedades del objeto dado
a la declaración de actualización, no es necesario agregar manualmente todas las propiedades, como ve, la identificación se excluye explícitamente de la declaración de actualización para evitar excepciones.
Si desea actualizar todo su BsonDocument, hay una conversión implícita de BsonDocument a UpdateDefinition.
https://github.com/mongodb/mongo-csharp-driver/blob/master/src/MongoDB.Driver/UpdateDefinition.cs
var doc = new BsonDocument() { .... } UpdateDefinition<BsonDocument> update = doc;