Docs Menu
Docs Home
/ /

Operaciones de escritura masiva

En esta guía, aprenderá a usar el controlador .NET/C# para realizar operaciones de escritura masiva. Al usar una operación de escritura masiva, puede realizar varias operaciones de escritura con menos llamadas a la base de datos.

Considere una situación que requiere insertar, actualizar y eliminar documentos para la misma tarea. Si utiliza los métodos de escritura individuales para cada tipo de operación, cada escritura accede a la base de datos por separado. Puede usar una operación de escritura masiva para optimizar el número de llamadas que su aplicación realiza al servidor.

Puedes utilizar el IMongoCollection.BulkWrite() o el método IMongoCollection.BulkWriteAsync() para realizar operaciones de escritura masiva en una sola colección. Cada método toma una lista de WriteModel<TDocument> instancias que describen las operaciones de escritura a realizar.

Los ejemplos de esta guía utilizan la colección sample_restaurants.restaurants de Conjuntos de datos de muestra de Atlas. Para aprender a crear un clúster gratuito de MongoDB Atlas y cargar los conjuntos de datos de muestra, consulte Tutorial deinicio rápido.

Para cada operación de escritura que desee realizar, cree una instancia de una de las siguientes clases WriteModel<TDocument>:

  • DeleteManyModel<TDocument>

  • DeleteOneModel<TDocument>

  • InsertOneModel<TDocument>

  • ReplaceOneModel<TDocument>

  • UpdateManyModel<TDocument>

  • UpdateOneModel<TDocument>

Las siguientes secciones muestran cómo crear y utilizar instancias de las clases anteriores para realizar la operación de escritura correspondiente en una operación de escritura masiva.

Tip

Operaciones de escritura masiva con POCO

Los ejemplos de esta guía utilizan el BsonDocument tipo para el TDocument tipo en todas las clases genéricas. También puede usar un objeto CLR simple (POCO) para estas clases. Para ello, debe definir una clase que represente los documentos de su colección. La clase debe tener propiedades que coincidan con los campos de sus documentos. Para obtener más información, consulte POCO.

Para realizar una operación de inserción, cree una instancia InsertOneModel<TDocument> y especifique el documento que desea insertar.

El siguiente ejemplo crea una instancia de la clase InsertOneModel<BsonDocument>. Esta instancia indica al controlador que inserte un documento cuyo campo "name" es "Mongo's Deli" en la colección restaurants.

var insertOneModel = new InsertOneModel<BsonDocument>(
new BsonDocument{
{ "name", "Mongo's Deli" },
{ "cuisine", "Sandwiches" },
{ "borough", "Manhattan" },
{ "restaurant_id", "1234" }
}
);

Para insertar varios documentos, cree una instancia de InsertOneModel<TDocument> para cada documento.

Importante

Error de clave duplicada

Al realizar una operación masiva, el InsertOneModel<TDocument> no puede insertar un documento con un _id ya existente en la colección. En este caso, el controlador lanza un MongoBulkWriteException.

Para actualizar un solo documento, cree un instancia de UpdateOneModel<TDocument> y pase los siguientes argumentos:

  • Filtro de consulta que especifica los criterios utilizados para buscar documentos en su colección. Para obtener más información sobre cómo especificar una consulta, consulte "Operadores de consulta y proyección" en el manual de MongoDB Server.

  • Documento de actualización que describe la actualización a realizar. Para obtener más información sobre cómo especificar una actualización, consulte "Operadores de actualización" en el manual de MongoDB Server.

Una UpdateOneModel<TDocument> instancia especifica una actualización para el primer documento que coincide con su filtro de consulta.

En el siguiente ejemplo de código, el objeto UpdateOneModel<BsonDocument> representa una operación de actualización en la colección restaurants. La operación busca el primer documento de la colección cuyo valor del campo name sea "Mongo's Deli". A continuación, actualiza el valor del campo cuisine del documento coincidente a "Sandwiches and Salads".

var updateOneModel = new UpdateOneModel<BsonDocument>(
Builders<BsonDocument>.Filter.Eq("name", "Mongo's Deli"),
Builders<BsonDocument>.Update.Set("cuisine", "Sandwiches and Salads")
);

Para actualizar varios documentos, cree una instancia de UpdateManyModel<TDocument> y pase los mismos argumentos que UpdateOneModel<TDocument> para. La UpdateManyModel<TDocument> clase especifica las actualizaciones para todos los documentos que coinciden con su filtro de consulta.

En el siguiente ejemplo de código, el objeto UpdateManyModel<BsonDocument> representa una operación de actualización en la colección restaurants. La operación busca todos los documentos de la colección cuyo valor del campo name sea "Mongo's Deli". A continuación, actualiza el valor del campo cuisine a "Sandwiches and Salads".

var updateManyModel = new UpdateManyModel<BsonDocument>(
Builders<BsonDocument>.Filter.Eq("name", "Mongo's Deli"),
Builders<BsonDocument>.Update.Set("cuisine", "Sandwiches and Salads")
);

Una operación de reemplazo elimina todos los campos y valores de un documento específico y los reemplaza con los nuevos campos y valores que usted especifique. Para realizar una operación de reemplazo, cree una instancia de ReplaceOneModel<TDocument> y pase un filtro de consulta y los campos y valores con los que desea reemplazar el documento coincidente.

En el siguiente ejemplo, el objeto ReplaceOneModel<BsonDocument> representa una operación de reemplazo en la colección restaurants. La operación busca el documento de la colección cuyo valor del campo restaurant_id es "1234". A continuación, elimina todos los campos excepto _id de este documento y establece nuevos valores en los campos name, cuisine, borough y restaurant_id.

var replaceOneModel = new ReplaceOneModel<BsonDocument>(
Builders<BsonDocument>.Filter.Eq("restaurant_id", "1234"),
new BsonDocument{
{ "name", "Mongo's Pizza" },
{ "cuisine", "Pizza" },
{ "borough", "Brooklyn" },
{ "restaurant_id", "5678" }
}
);

Para reemplazar varios documentos, debe crear una instancia de ReplaceOneModel<TDocument> para cada documento.

Para borrar un documento, crea una instancia de DeleteOneModel<TDocument> y pasa un filtro de query que especifique el documento que deseas borrar. Una instancia DeleteOneModel<TDocument> proporciona instrucciones para eliminar solo el primer documento que coincida con tu filtro de query.

En el siguiente ejemplo de código, el objeto DeleteOneModel<BsonDocument> representa una operación de eliminación en la colección restaurants. La operación busca y elimina el primer documento cuyo valor del campo restaurant_id sea "5678".

var deleteOneModel = new DeleteOneModel<BsonDocument>(
Builders<BsonDocument>.Filter.Eq("restaurant_id", "5678")
);

Para eliminar varios documentos, cree una instancia de DeleteManyModel<TDocument> y utilice un filtro de consulta que especifique los documentos que desea eliminar. Una instancia de DeleteManyModel<TDocument> proporciona instrucciones para eliminar todos los documentos que coincidan con su filtro de consulta.

En el siguiente ejemplo de código, el objeto DeleteManyModel<BsonDocument> representa una operación de eliminación en la colección restaurants. La operación busca y elimina todos los documentos cuyo valor del campo name sea "Mongo's Deli".

var deleteManyModel = new DeleteManyModel<BsonDocument>(
Builders<BsonDocument>.Filter.Eq("name", "Mongo's Deli")
);

Después de definir una instancia WriteModel para cada operación que desee realizar, cree una instancia de una clase que implemente la interfaz IEnumerable. Añada sus objetos WriteModel a esta IEnumerable y, a continuación, pase el IEnumerable al método BulkWrite() o BulkWriteAsync(). De forma predeterminada, estos métodos ejecutan las operaciones en el orden en que se definen en la lista.

Tip

IEnumerable

Array y List son dos clases comunes que implementan la interfaz IEnumerable.

Selecciona de las siguientes pestañas para ver cómo usar el método sincrónico BulkWrite() y el método asincrónico BulkWriteAsync() para realizar una operación de escritura masiva en la colección restaurants:

var models = new List<WriteModel<BsonDocument>>
{
new InsertOneModel<BsonDocument>(
new BsonDocument{
{ "name", "Mongo's Deli" },
{ "cuisine", "Sandwiches" },
{ "borough", "Manhattan" },
{ "restaurant_id", "1234" }
}
),
new InsertOneModel<BsonDocument>(
new BsonDocument{
{ "name", "Mongo's Deli" },
{ "cuisine", "Sandwiches" },
{ "borough", "Brooklyn" },
{ "restaurant_id", "5678" }
}
),
new UpdateManyModel<BsonDocument>(
Builders<BsonDocument>.Filter.Eq("name", "Mongo's Deli"),
Builders<BsonDocument>.Update.Set("cuisine", "Sandwiches and Salads")
),
new DeleteOneModel<BsonDocument>(
Builders<BsonDocument>.Filter.Eq("restaurant_id", "1234")
)
};
var results = collection.BulkWrite(models);
Console.WriteLine(results);
var models = new List<WriteModel<BsonDocument>>
{
new InsertOneModel<BsonDocument>(
new BsonDocument{
{ "name", "Mongo's Deli" },
{ "cuisine", "Sandwiches" },
{ "borough", "Manhattan" },
{ "restaurant_id", "1234" }
}
),
new InsertOneModel<BsonDocument>(
new BsonDocument{
{ "name", "Mongo's Deli" },
{ "cuisine", "Sandwiches" },
{ "borough", "Brooklyn" },
{ "restaurant_id", "5678" }
}
),
new UpdateManyModel<BsonDocument>(
Builders<BsonDocument>.Filter.Eq("name", "Mongo's Deli"),
Builders<BsonDocument>.Update.Set("cuisine", "Sandwiches and Salads")
),
new DeleteOneModel<BsonDocument>(
Builders<BsonDocument>.Filter.Eq("restaurant_id", "1234")
)
};
var results = await collection.BulkWriteAsync(models);
Console.WriteLine(results);

Los ejemplos de código anteriores producen el siguiente resultado:

MongoDB.Driver.BulkWriteResult1+Acknowledged[MongoDB.Bson.BsonDocument]

Nota

Cuando el controlador ejecuta una operación masiva, utiliza la preocupación de escritura de la colección de destino. El controlador informa todos los errores de preocupación de escritura después de intentar todas las operaciones, independientemente del orden de ejecución.

Al llamar al método BulkWrite() o BulkWriteAsync(), se puede pasar una instancia de la clase BulkWriteOptions. La clase BulkWriteOptions contiene las siguientes propiedades, que representan opciones que se pueden usar para configurar la operación de escritura masiva:

Propiedad
Descripción

BypassDocumentValidation

Specifies whether the operation bypasses document-level validation. For more information, see Schema Validation in the MongoDB Server manual.
Defaults to False.

Comment

A comment to attach to the operation, in the form of a BsonValue. For more information, see the delete command fields guide in the MongoDB Server manual.

IsOrdered

If True, the driver performs the write operations in the order provided. If an error occurs, the remaining operations are not attempted.

If False, the driver performs the operations in an arbitrary order and attempts to perform all operations. If any of the write operations in an unordered bulk write fail, the driver reports the errors only after attempting all operations.
Defaults to True.

Let

A map of parameter names and values, in the form of a BsonDocument. Values must be constant or closed expressions that don't reference document fields. For more information, see the let statement in the MongoDB Server manual.

Los siguientes ejemplos de código utilizan un objeto BulkWriteOptions para realizar una operación de escritura masiva desordenada:

var models = new List<WriteModel<BsonDocument>>
{
new DeleteOneModel<BsonDocument>(
Builders<BsonDocument>.Filter.Eq("restaurant_id", "5678")
)
};
var options = new BulkWriteOptions
{
IsOrdered = false,
};
collection.BulkWrite(models, options);
var models = new List<WriteModel<BsonDocument>>
{
new DeleteOneModel<BsonDocument>(
Builders<BsonDocument>.Filter.Eq("restaurant_id", "5678")
)
};
var options = new BulkWriteOptions
{
IsOrdered = false,
};
await collection.BulkWriteAsync(models, options);

Los métodos BulkWrite() y BulkWriteAsync() devuelven un objeto BulkWriteResult que contiene las siguientes propiedades:

Propiedad
Descripción

IsAcknowledged

Indicates whether the server acknowledged the bulk write operation. If the value of this property is False and you try to access any other property of the BulkWriteResult object, the driver throws an exception.

DeletedCount

The number of documents deleted, if any.

InsertedCount

The number of documents inserted, if any.

MatchedCount

The number of documents matched for an update, if applicable.

ModifiedCount

The number of documents modified, if any.

IsModifiedCountAvailable

Indicates whether the modified count is available.

Upserts

A list that contains information about each request that resulted in an upsert operation.

RequestCount

The number of requests in the bulk operation.

Si alguna de las operaciones en una operación de escritura masiva falla, el controlador .NET/C# lanza un BulkWriteError y no realiza ninguna operación adicional.

Un objeto BulkWriteError contiene la propiedad Index que describe el índice de la solicitud que resultó en un error.

Para aprender a realizar operaciones de escritura individuales, consulte las siguientes guías:

Para aprender más sobre cualquiera de los métodos o tipos analizados en esta guía, consulta la siguiente documentación de API:

Volver

Borrar

En esta página