Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
Docs Menu

Operaciones compuestas

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, consulta la guía Transacciones.

Los ejemplos en esta guía usan la siguiente estructura Course 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 := []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() 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().

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

SetCollation()

Tipo de intercalación de idioma que se utilizará al ordenar los resultados.
Valor predeterminado: nil

SetProjection()

Los campos que se incluirán en el documento devuelto.
Valor predeterminado: nil

SetSort()

Los campos de ordenación y las instrucciones para ordenar los documentos coinciden.
Predeterminado: nil

SetHint()

Índice que se utilizará para buscar documentos.
Valor predeterminado: nil

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}

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().

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

SetArrayFilters()

Elementos del array a los que se aplica la actualización.
Valor predeterminado: nil

SetBypassDocumentValidation()

Indica si se debe permitir que la operación de escritura excluya la validación a nivel de documento.
Valor predeterminado: false

SetCollation()

Tipo de intercalación de idioma que se utilizará al ordenar los resultados.
Valor predeterminado: nil

SetProjection()

Los campos que se incluirán en el documento devuelto.
Valor predeterminado: nil

SetReturnDocument()

Indica si se debe devolver el documento original o el actualizado SingleResult en.
Valor predeterminado: options.Before

SetSort()

Los campos de ordenación y las instrucciones para ordenar los documentos coinciden.
Predeterminado: nil

SetUpsert()

Indica si se debe insertar un nuevo documento si el filtro de consulta no coincide con ningún documento.
Valor predeterminado: false

SetHint()

Índice que se utilizará para buscar documentos.
Valor predeterminado: 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 "Modern"

  • 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 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.

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

SetBypassDocumentValidation()

Indica si se debe permitir que la operación de escritura excluya la validación a nivel de documento.
Valor predeterminado: false

SetCollation()

Tipo de intercalación de idioma que se utilizará al ordenar los resultados.
Valor predeterminado: nil

SetProjection()

Los campos que se incluirán en el documento devuelto.
Valor predeterminado: nil

SetReturnDocument()

Indica si se debe devolver el documento original o el reemplazado SingleResult en.
Valor predeterminado: nil

SetSort()

Los campos de ordenación y las instrucciones para ordenar los documentos coinciden.
Predeterminado: nil

SetUpsert()

Indica si se debe insertar un nuevo documento si el filtro de consulta no coincide con ningún documento.
Valor predeterminado: false

SetHint()

Índice que se utilizará para buscar documentos.
Valor predeterminado: 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: