Overview
En esta guía, se 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:
Tip
Para aprender a realizar operaciones compuestas en más de un documento a la vez, consulte el Transactions guide.
Datos de muestra
Los ejemplos en esta guía utilizan lo siguiente Course struct como modelo para documentos en 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 := []interface{}{ 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.
Encontrar y borrar
El método FindOneAndDelete() busca el primer documento que coincida con el filtro de query especificado y lo borra. El método retorna un SingleResult que contiene el documento eliminado.
Nota
El método FindOneAndDelete() es una operación atómica, lo que significa que evita que otras operaciones de guardar modifiquen el documento coincidente hasta que se complete. El método DeleteOne() también es una operación atómica, pero se diferencia del 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().
Modificar comportamiento
Puedes modificar el comportamiento del método FindOneAndDelete() pasando un FindOneAndDeleteOptions. Si no se especifica un FindOneAndDeleteOptions, el driver utiliza los valores por defecto para cada opción.
El tipo FindOneAndDeleteOptions te 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 maximum amount of time that the query can run on the server. 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 buscar y borrar el primer documento donde el valor del campo enrollment es 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 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 otras operaciones de guardar modifiquen el documento coincidente hasta que se complete. El método UpdateOne() también es una operación atómica, pero se diferencia del FindOneAndUpdate() en que no se puede especificar un orden de clasificación para los documentos coincidentes.
Para encontrar un documento y actualizarlo en operaciones separadas, llama al método FindOne() seguido del método UpdateOne().
Modificar comportamiento
Puedes modificar el comportamiento del método FindOneAndUpdate() pasando un FindOneAndUpdateOptions. Si no se especifica un FindOneAndUpdateOptions, el driver utiliza los valores por defecto para cada opción.
El tipo FindOneAndUpdateOptions te 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 maximum amount of time that the query can run on the server. 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 "Modern"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 coincida con el filtro de query especificado y lo reemplaza por 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. Al utilizar FindOneAndReplace(), también se puede establecer un orden de clasificación en los documentos coincidentes.
Para encontrar un documento y reemplazarlo en operaciones separadas, llama al método FindOne() seguido del método ReplaceOne().
Modificar comportamiento
Puedes modificar el comportamiento del método FindOneAndReplace() pasando un FindOneAndReplaceOptions. Si no se especifica un FindOneAndReplaceOptions, el driver utiliza los valores por defecto para cada opción.
El tipo FindOneAndReplaceOptions te 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 maximum amount of time that the query can run on the server. 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 el
titlees "Teoría de la Representación"Reemplaza el documento emparejado por un documento nuevo donde el
titlees "Teoría combinatoria" y elenrollmentes35
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: