Overview
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:
Tip
Datos de muestra
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.
Buscar y eliminar
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().
Modificar el comportamiento
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 |
|---|---|
| The type of language collation to use when sorting results. Default: nil |
| The fields to include in the document returned. Default: nil |
| The sort fields and directions to order the documents matched. Default: nil |
| The index to use to scan for documents. Default: nil |
Ejemplo
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}
Buscar y actualizar
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().
Modificar el comportamiento
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 |
|---|---|
| The array elements the update applies to. Default: nil |
| Whether to allow the write operation to opt-out of document level validation. Default: false |
| The type of language collation to use when sorting results. Default: nil |
| The fields to include in the document returned. Default: nil |
| Whether to return the original or updated document in the SingleResult.Default: options.Before |
| The sort fields and directions to order the documents matched. Default: nil |
| Whether to insert a new document if the query filter doesn't match any documents. Default: false |
| The index to use to scan for documents. Default: nil |
Ejemplo
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
titleincluye "Moderno".Actualiza el valor del campo
enrollmentdel documento coincidente a32Devuelve 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}
Buscar y reemplazar
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.
Modificar el comportamiento
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 |
|---|---|
| Whether to allow the write operation to opt-out of document level validation. Default: false |
| The type of language collation to use when sorting results. Default: nil |
| The fields to include in the document returned. Default: nil |
| Whether to return the original or replaced document in the SingleResult.Default: nil |
| The sort fields and directions to order the documents matched. Default: nil |
| Whether to insert a new document if the query filter doesn't match any documents. Default: false |
| The index to use to scan for documents. Default: nil |
Ejemplo
El siguiente ejemplo utiliza el método FindOneAndReplace() para realizar las siguientes acciones en orden:
Coincide con el primer documento donde
titlees "Teoría de la representación".Reemplaza el documento coincidente con un nuevo documento donde
titlees "Teoría combinatoria" yenrollmentes35
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}
Información Adicional
Para obtener más información sobre cómo realizar las operaciones mencionadas, consulte las siguientes guías:
Documentación de la API
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: