Docs Menu
Docs Home
/ /

Operaciones compuestas

En esta guía, puede aprender a realizar operaciones compuestas.

Las operaciones compuestas combinan lectura y escritura en una sola. Si realizas una operación de lectura y escritura por separado, existe la posibilidad de que alguien más modifique el documento entre ambas operaciones. MongoDB evita esto colocando un bloqueo de escritura en el documento que estás modificando mientras dura la operación compuesta.

MongoDB admite las siguientes operaciones compuestas:

  • Buscar y eliminar un documento

  • Buscar y actualizar un documento

  • Buscar y reemplazar un documento

Tip

Para aprender a realizar operaciones compuestas en más de un documento a la vez, consulte la Guía de transacciones.

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

type Course struct {
Title string
Enrollment int32
}

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

coll := client.Database("db").Collection("courses")
docs := []any{
Course{Title: "Representation Theory", Enrollment: 40},
Course{Title: "Early Modern Philosophy", Enrollment: 25},
Course{Title: "Animal Communication", Enrollment: 18},
}
result, err := coll.InsertMany(context.TODO(), docs)

Cada documento contiene una descripción de un curso universitario que incluye el título del curso y la matrícula máxima, correspondiente a los campos title y enrollment 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.

El método FindOneAndDelete() encuentra el primer documento que coincide con el filtro de consulta especificado y lo elimina. El método devuelve un SingleResult que contiene el documento eliminado.

Nota

El método FindOneAndDelete() es una operación atómica, lo que significa que impide que cualquier otra operación de escritura modifique el documento coincidente hasta que este se complete. El método DeleteOne() también es una operación atómica, pero se diferencia de FindOneAndDelete() en que no se puede especificar un orden de clasificación para los documentos coincidentes.

Para encontrar un documento y eliminarlo en operaciones separadas, llame al método FindOne() seguido del método DeleteOne().

Puede modificar el comportamiento del método FindOneAndDelete() pasando un FindOneAndDeleteOptions. Si no especifica un FindOneAndDeleteOptions, el controlador utiliza los valores predeterminados para cada opción.

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

Método
Descripción

SetCollation()

The type of language collation to use when sorting results.
Default: nil

SetProjection()

The fields to include in the document returned.
Default: nil

SetSort()

The sort fields and directions to order the documents matched.
Default: nil

SetHint()

The index to use to scan for documents.
Default: nil

El siguiente ejemplo utiliza el método FindOneAndDelete() para hacer coincidir y eliminar el primer documento donde el valor del campo enrollment sea menor que 20:

filter := bson.D{{"enrollment", bson.D{{"$lt", 20}}}}
var deletedDoc Course
err := coll.FindOneAndDelete(context.TODO(), filter).Decode(&deletedDoc)
if err != nil {
panic(err)
}
res, _ := bson.MarshalExtJSON(deletedDoc, false, false)
fmt.Println(string(res))
{"title":"Animal Communication","enrollment":18}

El método FindOneAndUpdate() encuentra el primer documento que coincide con el filtro de consulta especificado y lo actualiza según el documento actualizado. El método devuelve un SingleResult que contiene el documento coincidente.

Nota

El método FindOneAndUpdate() es una operación atómica, lo que significa que impide que cualquier otra operación de escritura modifique el documento correspondiente hasta que este se complete. El método UpdateOne() también es una operación atómica, pero se diferencia de FindOneAndUpdate() en que no se puede devolver la imagen previa del documento actualizado al usar UpdateOne().

Para encontrar un documento y actualizarlo en operaciones separadas, llame al método FindOne() seguido del método UpdateOne().

Puede modificar el comportamiento del método FindOneAndUpdate() pasando un FindOneAndUpdateOptions. Si no especifica un FindOneAndUpdateOptions, el controlador utiliza los valores predeterminados para cada opción.

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

Método
Descripción

SetArrayFilters()

The array elements the update applies to.
Default: nil

SetBypassDocumentValidation()

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

SetCollation()

The type of language collation to use when sorting results.
Default: nil

SetProjection()

The fields to include in the document returned.
Default: nil

SetReturnDocument()

Whether to return the original or updated document in the SingleResult.
Default: options.Before

SetSort()

The sort fields and directions to order the documents matched.
Default: nil

SetUpsert()

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

SetHint()

The index to use to scan for documents.
Default: nil

El siguiente ejemplo utiliza el método FindOneAndUpdate() para realizar las siguientes acciones en orden:

  • Coincide con el primer documento donde el valor del campo title incluye "Moderno".

  • Actualiza el valor del campo enrollment del documento coincidente a 32

  • Devuelve el documento actualizado

filter := bson.D{{"title", bson.D{{"$regex", "Modern"}}}}
update := bson.D{{"$set", bson.D{{"enrollment", 32}}}}
opts := options.FindOneAndUpdate().SetReturnDocument(options.After)
var updatedDoc Course
err := coll.FindOneAndUpdate(context.TODO(), filter, update, opts).Decode(&updatedDoc)
if err != nil {
panic(err)
}
res, _ := bson.MarshalExtJSON(updatedDoc, false, false)
fmt.Println(string(res))
{"title":"Early Modern Philosophy","enrollment":32}

El método FindOneAndReplace() encuentra el primer documento que coincide con el filtro de consulta especificado y lo reemplaza con el documento de reemplazo. El método devuelve un SingleResult que contiene el documento coincidente.

Nota

Este método se diferencia del método ReplaceOne(). FindOneAndReplace() realiza una búsqueda y reemplazo como una sola operación y elimina la posibilidad de que alguien altere un documento entre ambas operaciones.

Puede modificar el comportamiento del método FindOneAndReplace() pasando un FindOneAndReplaceOptions. Si no especifica un FindOneAndReplaceOptions, el controlador utiliza los valores predeterminados para cada opción.

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

Método
Descripción

SetBypassDocumentValidation()

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

SetCollation()

The type of language collation to use when sorting results.
Default: nil

SetProjection()

The fields to include in the document returned.
Default: nil

SetReturnDocument()

Whether to return the original or replaced document in the SingleResult.
Default: nil

SetSort()

The sort fields and directions to order the documents matched.
Default: nil

SetUpsert()

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

SetHint()

The index to use to scan for documents.
Default: nil

El siguiente ejemplo utiliza el método FindOneAndReplace() para realizar las siguientes acciones en orden:

  • Coincide con el primer documento donde title es "Teoría de la representación".

  • Reemplaza el documento coincidente con un nuevo documento donde title es "Teoría combinatoria" y enrollment es 35

filter := bson.D{{"title", "Representation Theory"}}
replacement := Course{Title: "Combinatorial Theory", Enrollment: 35}
var outdatedDoc Course
err := coll.FindOneAndReplace(context.TODO(), filter, replacement).Decode(&previousDoc)
if err != nil {
panic(err)
}
res, _ := bson.MarshalExtJSON(outdatedDoc, false, false)
fmt.Println(string(res))
{"title":"Representation Theory","enrollment":40}

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

Transacciones

En esta página