Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Operaciones compuestas

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

Las operaciones compuestas combinan una operación de lectura y guardado en una sola operación. Si realizas una operación de lectura y guardar por separado, hay una posibilidad de que alguien más pueda modificar el documento entre ambas operaciones. MongoDB evita esto colocando un bloqueo de escritura en el documento que está modificando durante la duración de su 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 Transactions guide.

Los ejemplos en 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 en esta guía, carga 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 una asignatura universitaria que incluye el título y la cantidad máxima de inscritos, correspondientes a los campos title y enrollment 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.

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 buscar un documento y borrarlo en operaciones independientes, llama al método FindOne() seguido por el 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 te 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 query especificado y lo actualiza de acuerdo con el documento de actualización. 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 evita que cualquier otra operación de escritura cambie el documento de coincidencia hasta que se complete. El método UpdateOne() también es una operación atómica, pero difiere de FindOneAndUpdate() porque no se puede devolver la preimagen del documento actualizado al utilizar UpdateOne().

Para encontrar un documento y actualizarlo en operaciones separadas, llama 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 te 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 te 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 el title es "Teoría de la Representación"

  • Reemplaza el documento emparejado por un documento nuevo donde el title es "Teoría combinatoria" y el 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