Docs Menu
Docs Home
/ /

Operaciones masivas

En esta guía, podrá aprender a utilizar operaciones masivas.

Las operaciones masivas realizan un gran número de operaciones de escritura. En lugar de realizar una llamada a la base de datos para cada operación, las operaciones masivas realizan varias operaciones con una sola llamada.

Los ejemplos de esta guía utilizan lo siguiente: Book Estructura como modelo para los documentos de la colección books:

type Book struct {
Title string
Author string
Length int32
}

Para ejecutar los ejemplos de esta guía, cargue 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 longitud de la página correspondiente a los campos title, author y length de cada documento.

Tip

Bases de datos y colecciones inexistentes

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

Para realizar una operación masiva, pase una matriz de Escribe los documentos del BulkWrite() modelo en el método.

El método BulkWrite() puede tomar opcionalmente el tipo BulkWriteOptions, que representa las opciones que se pueden usar para modificar su comportamiento. Si no se especifica un tipo BulkWriteOptions, el controlador utiliza los valores predeterminados para cada opción.

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

Método
Descripción

SetBypassDocumentValidation()

Whether to allow the write to opt-out of document level validation.
Default: false

SetOrdered()

Whether to stop performing write operations after an error occurs.
Default: true

El método BulkWrite() devuelve un tipo BulkWriteResult, que contiene información sobre la operación masiva si se realiza correctamente. El tipo BulkWriteResult contiene las siguientes propiedades:

Propiedad
Descripción

InsertedCount

El número de documentos insertados.

MatchedCount

El número de documentos coincidentes con el Filtro de consulta en operaciones de actualización y reemplazo.

ModifiedCount

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

DeletedCount

El número de documentos borrados.

UpsertedCount

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

UpsertedIDs

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

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

Para insertar un documento, cree un InsertOneModel que especifique el documento que desea insertar. Para insertar varios documentos, cree un InsertOneModel para cada uno.

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

Método
Descripción

SetDocument()

The document to insert.

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 reemplazar, cree un ReplaceOneModel que especifique el documento que desea reemplazar y un documento de reemplazo. Para reemplazar varios documentos, cree un ReplaceOneModel para cada documento que desee reemplazar.

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

Método
Descripción

SetCollation()

The type of language collation to use when sorting results.

SetFilter()

The query filter specifying which document to replace.

SetHint()

The index to use to scan for documents.

SetReplacement()

The document to replace the matched document with.

SetUpsert()

Whether to insert a new document if the query filter doesn't match any documents.

El siguiente ejemplo crea un ReplaceOneModel para reemplazar un documento donde el title es "Lucy" con 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, cree un UpdateOneModel que especifique el documento que desea actualizar y un documento de actualización. Para actualizar varios documentos, utilice UpdateManyModel el.

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

Método
Descripción

SetArrayFilters()

The array elements the update applies to.

SetCollation()

The type of language collation to use when sorting results.

SetFilter()

The query filter specifying which document to update.

SetHint()

The index to use to scan for documents.

SetUpdate()

The modifications to apply on the matched documents.

SetUpsert()

Whether to insert a new document if the query filter doesn't match any documents.

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.

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

Método
Descripción

SetCollation()

The type of language collation to use when sorting results.

SetFilter()

The query filter specifying which document to delete.

SetHint()

The index to use to scan for documents.

El siguiente ejemplo crea un DeleteManyModel para eliminar documentos donde length es mayor que 300:

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

El método BulkWrite() le permite especificar si desea ejecutar las operaciones masivas de forma ordenada o desordenada en su BulkWriteOptions.

De forma predeterminada, el método BulkWrite() ejecuta operaciones masivas en el orden en que las agregó y se detiene si ocurre un error.

Tip

Esto es equivalente 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 se produce un error, especifique false en el método SetOrdered(). El método informa los errores posteriormente.

El siguiente ejemplo realiza las siguientes acciones en cualquier orden:

  • Inserta dos documentos.

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

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

  • Elimina todos los documentos donde el valor del campo author incluye "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 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:

Volver

Delete Documents

En esta página