Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
Docs Menu

Operaciones masivas

En esta guía, puedes aprender a utilizar operaciones masivas.

Las operaciones masivas ejecutan una gran cantidad de operaciones de guardar. En lugar de realizar una llamada a la base de datos por cada operación, las operaciones por lotes ejecutan múltiples operaciones en una sola llamada a la base de datos.

Los ejemplos en esta guía usan la siguiente estructura Book como modelo para documentos en la colección books:

type Book struct {
Title string
Author string
Length int32
}

Para ejecutar los ejemplos en esta guía, carga los datos de muestra en la colección db.books con el siguiente fragmento:

coll := client.Database("db").Collection("books")
docs := []interface{}{
Book{Title: "My Brilliant Friend", Author: "Elena Ferrante", Length: 331},
Book{Title: "Lucy", Author: "Jamaica Kincaid", Length: 103},
}
result, err := coll.InsertMany(context.TODO(), docs)

Cada documento contiene una descripción de un libro que incluye el título, el autor y la extensión en páginas que corresponden a los campos title, author y length en cada documento.

Tip

Bases de datos y colecciones inexistentes

Si la base de datos y la colección necesarias no existen cuando realizas una operación de guardar, el servidor las crea implícitamente.

Para realizar una operación masiva, pasa un arreglo de documentos WriteModel al método BulkWrite().

El método BulkWrite() opcionalmente acepta un tipo BulkWriteOptions, que representa opciones que puede utilizar para modificar su comportamiento. Si no especifica un BulkWriteOptions, el driver utiliza los valores por defecto para cada opción.

El tipo BulkWriteOptions te permite configurar opciones con los siguientes métodos:

Método
Descripción

SetBypassDocumentValidation()

Si se permite que la operación de guardar se excluya de la validación a nivel de documento.
Por defecto: false

SetOrdered()

Si se debe detener la operación de guardar después de que se produzca un error.
Por defecto: true

El método BulkWrite() devuelve un tipo BulkWriteResult, que contiene información sobre la operación por lotes si tiene éxito. El tipo BulkWriteResult contiene las siguientes propiedades:

Propiedad
Descripción

InsertedCount

El número de documentos insertados.

MatchedCount

El número de documentos coincidentes por el filtro de query en las operaciones de actualización y reemplazo.

ModifiedCount

El número de documentos modificados por las operaciones de actualización y reemplazo.

DeletedCount

El número de documentos borrados.

UpsertedCount

El número de documentos insertados o actualizados mediante operaciones de actualización y reemplazo.

UpsertedIDs

Un mapa de un índice de operación al _id de cada documento insertado o actualizado.

Un WriteModel representa una operación de inserción, reemplazo, actualización o borrar.

Para realizar una operación de inserción, crea un InsertOneModel especificando el documento que desea insertar. Para insertar varios documentos, crea un InsertOneModel para cada documento que desees insertar.

El InsertOneModel permite especificar su comportamiento con el siguiente método:

Método
Descripción

SetDocument()

El documento a insertar.

Este siguiente ejemplo crea dos instancias de InsertOneModel para insertar dos documentos:

models := []mongo.WriteModel{
mongo.NewInsertOneModel().SetDocument(Book{Title: "Beloved", Author: "Toni Morrison", Length: 324}),
mongo.NewInsertOneModel().SetDocument(Book{Title: "Outline", Author: "Rachel Cusk", Length: 258}),
}

Para realizar una operación de reemplazo, crea un ReplaceOneModel especificando el documento que deseas reemplazar y un documento de reemplazo. Para reemplazar varios documentos, cree un ReplaceOneModel para cada documento que desee reemplazar.

El ReplaceOneModel te permite especificar su comportamiento con los siguientes métodos:

Método
Descripción

SetCollation()

El tipo de intercalación lingüística que se debe utilizar al ordenar resultados.

SetFilter()

El filtro de query especifica qué documento se debe reemplazar.

SetHint()

El índice que se debe usar para buscar documentos.

SetReplacement()

El documento con el que se debe reemplazar el documento coincidente.

SetUpsert()

Si se debe insertar un nuevo documento si el filtro de query no coincide con ningún documento.

El siguiente ejemplo crea un ReplaceOneModel para sustituir un documento en el que el title es "Lucy" por un nuevo documento:

models := []mongo.WriteModel{
mongo.NewReplaceOneModel().SetFilter(bson.D{{"title", "Lucy"}}).
SetReplacement(Book{Title: "On Beauty", Author: "Zadie Smith", Length: 473}),
}

Para realizar una operación de actualización, crea un UpdateOneModel que especifique el documento que deseas actualizar y un documento de actualización. Para actualizar varios documentos, use el UpdateManyModel.

El UpdateOneModel y el UpdateManyModel permiten especificar su comportamiento con los siguientes métodos:

Método
Descripción

SetArrayFilters()

Los elementos del arreglo a los que se aplica la actualización.

SetCollation()

El tipo de intercalación lingüística que se debe utilizar al ordenar resultados.

SetFilter()

El filtro de query que especifica qué documento actualizar.

SetHint()

El índice que se debe usar para buscar documentos.

SetUpdate()

Las modificaciones que se deben aplicar a los documentos que coinciden.

SetUpsert()

Si se debe insertar un nuevo documento si el filtro de query no coincide con ningún documento.

El siguiente ejemplo crea un UpdateOneModel para disminuir el length de un documento en 15 si el author es "Elena Ferrante":

models := []mongo.WriteModel{
mongo.NewUpdateOneModel().SetFilter(bson.D{{"author", "Elena Ferrante"}}).
SetUpdate(bson.D{{"$inc", bson.D{{"length", -15}}}}),
}

Para realizar una operación de borrado, cree un DeleteOneModel especificando el documento que desea eliminar. Para borrar varios documentos, utilice el DeleteManyModel.

El DeleteOneModel y el DeleteManyModel permiten especificar su comportamiento con los siguientes métodos:

Método
Descripción

SetCollation()

El tipo de intercalación lingüística que se debe utilizar al ordenar resultados.

SetFilter()

El filtro de query que especifica qué documento borrar.

SetHint()

El índice que se debe usar para buscar documentos.

El siguiente ejemplo crea un DeleteManyModel para borrar documentos cuando el length es mayor que 300:

models := []mongo.WriteModel{
mongo.NewDeleteManyModel().SetFilter(bson.D{{"length", bson.D{{"$gt", 300}}}}),
}

El método BulkWrite() te permite especificar si quieres ejecutar las operaciones de lote como ordenadas o desordenadas en su BulkWriteOptions.

Por defecto, el método BulkWrite() ejecuta las operaciones en lote en el orden en que se agregaron y se detiene si se produce un error.

Tip

Esto equivale a especificar true en el método SetOrdered():

opts := options.BulkWrite().SetOrdered(true)

Para ejecutar operaciones de escritura masiva en cualquier orden y continuar si ocurre un error, especifique false en el método SetOrdered(). El método informa los errores después.

El siguiente ejemplo realiza las siguientes acciones en cualquier orden:

  • Inserta dos documentos.

  • Reemplaza un documento donde title es "Mi amiga brillante" con un nuevo documento.

  • Incrementa cada documento length en 10 si el valor actual de length es menor que 200.

  • Elimina todos los documentos donde el valor del campo author incluya "Jam".

models := []mongo.WriteModel{
mongo.NewInsertOneModel().SetDocument(Book{Title: "Middlemarch", Author: "George Eliot", Length: 904}),
mongo.NewInsertOneModel().SetDocument(Book{Title: "Pale Fire", Author: "Vladimir Nabokov", Length: 246}),
mongo.NewReplaceOneModel().SetFilter(bson.D{{"title", "My Brilliant Friend"}}).
SetReplacement(Book{Title: "Atonement", Author: "Ian McEwan", Length: 351}),
mongo.NewUpdateManyModel().SetFilter(bson.D{{"length", bson.D{{"$lt", 200}}}}).
SetUpdate(bson.D{{"$inc", bson.D{{"length", 10}}}}),
mongo.NewDeleteManyModel().SetFilter(bson.D{{"author", bson.D{{"$regex", "Jam"}}}}),
}
opts := options.BulkWrite().SetOrdered(false)
results, err := coll.BulkWrite(context.TODO(), models, opts)
if err != nil {
panic(err)
}
fmt.Printf("Number of documents inserted: %d\n", results.InsertedCount)
fmt.Printf("Number of documents replaced or updated: %d\n", results.ModifiedCount)
fmt.Printf("Number of documents deleted: %d\n", results.DeletedCount)
Number of documents inserted: 2
Number of documents replaced or updated: 2
Number of documents deleted: 1

Los siguientes documentos están presentes en la colección books después de la operación masiva:

{"title":"Atonement","author":"Ian McEwan","length":351}
{"title":"Middlemarch","author":"George Eliot","length":904}
{"title":"Pale Fire","author":"Vladimir Nabokov","length":246}

Para obtener un ejemplo ejecutable sobre cómo realizar una operación por lotes, consulta Realizar operaciones por lotes

Para obtener más información sobre cómo realizar las operaciones mencionadas, consulte las siguientes guías:

Para obtener más información sobre cualquiera de los métodos o tipos discutidos en esta guía, consultar la siguiente documentación de la API: