Overview
En esta guía, puede aprender a utilizar el controlador .NET/C# para reemplazar documentos en una colección MongoDB.
El controlador .NET/C# proporciona la ReplaceOne() y ReplaceOneAsync() métodos. Estos métodos remueven todos los campos (excepto el campo _id) del primer documento que coincide con los criterios de búsqueda, luego insertan los campos y valores que especifiques en el documento.
Nota
Sobrecargas de métodos
Muchos de los métodos en esta página tienen múltiples sobrecargas. Los ejemplos en esta guía muestran solo una definición de cada método. Para obtener más información sobre las sobrecargas disponibles, consulta la Documentación de la API.
Datos de muestra
Los ejemplos de esta guía utilizan la colección restaurants de la base de datos sample_restaurants. Los documentos de esta colección utilizan las siguientes clases Restaurant, Address y GradeEntry como modelos:
public class Restaurant { public ObjectId Id { get; set; } public string Name { get; set; } [] public string RestaurantId { get; set; } public string Cuisine { get; set; } public Address Address { get; set; } public string Borough { get; set; } public List<GradeEntry> Grades { get; set; } }
public class Address { public string Building { get; set; } [] public double[] Coordinates { get; set; } public string Street { get; set; } [] public string ZipCode { get; set; } }
public class GradeEntry { public DateTime Date { get; set; } public string Grade { get; set; } public float? Score { get; set; } }
Nota
Los documentos de la colección restaurants utilizan la convención de nomenclatura snake-case. Los ejemplos de esta guía utilizan un ConventionPack para deserializar los campos de la colección en notación Pascal y asignarlos a las propiedades de la clase Restaurant.
Para obtener más información sobre la serialización personalizada, consulta Serialización personalizada.
Esta colección proviene de los conjuntos de datos de muestra proporcionados por Atlas. Consulta la Guía de inicio rápido para aprender a crear un clúster gratuito de MongoDB y cargar estos datos de ejemplo.
Reemplazar un documento
Para reemplazar un documento en una colección, llama al método ReplaceOne() o ReplaceOneAsync(). Estos métodos aceptan los siguientes parámetros:
Parameter | Descripción |
|---|---|
| Un filtro de query que especifica el documento a reemplazar. Puede usar la clase Tipo de dato: FilterDefinition<TDocument> |
| Un documento de reemplazo que especifica los campos y valores que se deben insertar en el nuevo documento. Si los documentos de tu colección se asignan a una clase de C#, el documento de reemplazo puede ser una instancia de esta clase. Tipo de dato: |
| opcional. Una instancia de la clase Tipo de dato: ReplaceOptions |
| Opcional. Un token que puedes usar para cancelar la operación. Tipo de dato: CancellationToken |
El siguiente ejemplo de código demuestra cómo realizar una operación de reemplazo. El código realiza los siguientes pasos:
Crea un filtro de query utilizando la clase
Builders. El filtro coincide con todos los documentos donde el campocuisinetiene el valor"Pizza".Crea un nuevo objeto
Restaurant.Llama al método
ReplaceOne()en la colecciónrestaurants. Esta operación busca el primer documento coincidente de la colección y lo reemplaza por el documento recién creado.
Selecciona el Synchronous o la pestaña Asynchronous para ver el código correspondiente.
// Creates a filter for all restaurant documents that have a "cuisine" value of "Pizza" var filter = Builders<Restaurant>.Filter .Eq(r => r.Cuisine, "Pizza"); // Finds the ID of the first restaurant document that matches the filter var oldPizzaRestaurant = _restaurantsCollection.Find(filter).First(); var oldId = oldPizzaRestaurant.Id; // Generates a new restaurant document Restaurant newPizzaRestaurant = new() { Id = oldId, Name = "Mongo's Pizza", Cuisine = "Pizza", Address = new Address() { Street = "Pizza St", ZipCode = "10003" }, Borough = "Manhattan", }; // Replaces the existing restaurant document with the new document return _restaurantsCollection.ReplaceOne(filter, newPizzaRestaurant);
// Creates a filter for all restaurant documents that have a "cuisine" value of "Pizza" var filter = Builders<Restaurant>.Filter .Eq(r => r.Cuisine, "Pizza"); // Finds the ID of the first restaurant document that matches the filter var oldPizzaRestaurant = _restaurantsCollection.Find(filter).First(); var oldId = oldPizzaRestaurant.Id; // Generates a new restaurant document Restaurant newPizzaRestaurant = new() { Id = oldId, Name = "Mongo's Pizza", Cuisine = "Pizza", Address = new Address() { Street = "Pizza St", ZipCode = "10003" }, Borough = "Manhattan", }; // Asynchronously replaces the existing restaurant document with the new document return await _restaurantsCollection.ReplaceOneAsync(filter, newPizzaRestaurant);
Importante
Los valores de los campos _id son inmutables. Si el documento de reemplazo especifica un valor para el campo _id, este debe coincidir con el valor _id del documento existente.
Si el documento de reemplazo no especifica un valor para el campo _id, puedes agregar el atributo [BsonIgnoreIfDefault] al campo _id en tu objeto común de CLR/clase (POCO). Utiliza [BsonIgnoreIfDefault] si el campo _id de tu POCO es del tipo ObjectId.
El siguiente ejemplo muestra cómo agregar este atributo:
public class Restaurant { [] public ObjectId Id { get; set; } // Other properties }
Personalizar la operación de reemplazo
Los métodos ReplaceOne() y ReplaceOneAsync() aceptan opcionalmente como parámetro un objeto ReplaceOptions, que representa opciones que puede usar para configurar la operación de sustitución.
La clase ReplaceOptions contiene las siguientes propiedades:
Propiedad | Descripción |
|---|---|
| Especifica si la operación de reemplazo omite la validación de documentos. Esto permite reemplazar documentos que no cumplen los requisitos de validación del esquema, si los hay. Consulte el manual de MongoDB Server para obtener más información sobre la validación del esquema. Tipo de dato: |
| Especifica el tipo de intercalación de lenguaje a utilizar al ordenar los resultados. Consulta el manual de MongoDB Server para obtener más información sobre la intercalación. Tipo de dato: Intercalación |
| Obtiene o establece el comentario proporcionado por el usuario para la operación. Para obtener más información, consulta el manual de MongoDB Server. Tipo de dato: BsonValue |
| Obtiene o establece el índice que se utilizará para buscar documentos. Para obtener más información, consulta el manual de MongoDB Server. Tipo de dato: BsonValue |
| Especifica si la operación de reemplazo realiza una operación inserción si ningún documentos coincide con el filtro de query. Para obtener más información, consulta el manual de MongoDB Server. Tipo de dato: |
| Obtiene o establece el documento let. Para obtener más información, consulta el manual de MongoDB Server. Tipo de dato: Documento Bson |
El siguiente ejemplo realiza los mismos pasos que el ejemplo anterior, pero también utiliza la opción BypassDocumentValidation para omitir cualquier requisito de validación del esquema. Selecciona la pestaña Synchronous o Asynchronous para ver el código correspondiente.
// Creates a filter for all restaurant documents that have a "cuisine" value of "Pizza" var filter = Builders<Restaurant>.Filter .Eq(r => r.Cuisine, "Pizza"); // Finds the ID of the first restaurant document that matches the filter var oldPizzaRestaurant = _restaurantsCollection.Find(filter).First(); var oldId = oldPizzaRestaurant.Id; // Generates a new restaurant document Restaurant newPizzaRestaurant = new() { Id = oldId, Name = "Mongo's Pizza", Cuisine = "Pizza", Address = new Address() { Street = "Pizza St", ZipCode = "10003" }, Borough = "Manhattan", }; var options = new ReplaceOptions { BypassDocumentValidation = true }; // Replaces the existing restaurant document with the new document return _restaurantsCollection.ReplaceOne(filter, newPizzaRestaurant, options);
// Creates a filter for all restaurant documents that have a "cuisine" value of "Pizza" var filter = Builders<Restaurant>.Filter .Eq(r => r.Cuisine, "Pizza"); // Finds the ID of the first restaurant document that matches the filter var oldPizzaRestaurant = _restaurantsCollection.Find(filter).First(); var oldId = oldPizzaRestaurant.Id; // Generates a new restaurant document Restaurant newPizzaRestaurant = new() { Id = oldId, Name = "Mongo's Pizza", Cuisine = "Pizza", Address = new Address() { Street = "Pizza St", ZipCode = "10003" }, Borough = "Manhattan", }; var options = new ReplaceOptions { BypassDocumentValidation = true }; // Asynchronously replaces the existing restaurant document with the new document return await _restaurantsCollection.ReplaceOneAsync(filter, newPizzaRestaurant, options);
Valor de retorno
El método ReplaceOne() retorna un objeto ReplaceOneResult, y el método ReplaceOneAsync() retorna un objeto Task<ReplaceOneResult>. La clase ReplaceOneResult contiene las siguientes propiedades:
Propiedad | Descripción |
|---|---|
| Indica si MongoDB reconoció o no la operación de reemplazo. Tipo de dato: |
| Indica si puedes leer la cuenta de los registros reemplazados en el Tipo de dato: |
| La cantidad de documentos que coincidieron con el filtro de query, independientemente de si uno fue reemplazado. Tipo de dato: |
| La cantidad de documentos reemplazados por la operación de reemplazo. Tipo de dato: |
| El ID del documento que se insertó en la base de datos, si el controlador realizó una inserción. Tipo de dato: BsonValue |
Documentación de la API
Para aprender más sobre cualquiera de los métodos y clases utilizados en esta página, consulta la siguiente documentación de la API: