Docs Menu
Docs Home
/ /

Modificar documentos

En esta guía, aprenderá a modificar documentos de su colección MongoDB desde su aplicación Laravel usando Laravel MongoDB. Utilice operaciones de actualización para modificar documentos existentes o para insertar uno si ninguno coincide con los criterios de búsqueda.

Puede conservar los cambios en una instancia de un modelo Eloquent o utilizar la sintaxis fluida de Eloquent para encadenar una operación de actualización en métodos que devuelven un objeto de colección de Laravel.

Esta guía proporciona ejemplos de las siguientes operaciones de actualización:

  • Actualizar un documento

  • Actualizar varios documentos

  • Actualizar o insertar en una sola operación

  • Actualizar matrices en un documento

Las operaciones de esta guía hacen referencia a la siguiente clase de modelo Eloquent:

Concierto.php
<?php
namespace App\Models;
use MongoDB\Laravel\Eloquent\Model;
class Concert extends Model
{
protected $connection = 'mongodb';
protected $fillable = ['performer', 'venue', 'genres', 'ticketsSold', 'performanceDate'];
protected $casts = ['performanceDate' => 'datetime'];
}

Tip

El $fillable El atributo permite usar la asignación masiva de Laravel para operaciones de inserción. Para obtener más información sobre la asignación masiva, consulte Personalice la asignación masiva en la documentación de la clase del modelo Eloquent.

El $casts atributo indica a Laravel que convierta los atributos a tipos de datos comunes. Para obtener más información, consulta "Conversión de atributos" en la documentación de Laravel.

Puede actualizar un documento de las siguientes maneras:

  • Modifique una instancia del modelo y guarde los cambios llamando al método save().

  • Métodos de cadena para recuperar una instancia de un modelo y realizar actualizaciones en él llamando al método update().

El siguiente ejemplo muestra cómo actualizar un documento modificando una instancia del modelo y llamando a su método save():

$concert = Concert::first();
$concert->venue = 'Manchester Arena';
$concert->ticketsSold = 9543;
$concert->save();

Cuando el método save() tiene éxito, la instancia del modelo en la que llamó al método contiene los valores actualizados.

Si la operación falla, la integración de Laravel asigna a la instancia del modelo un valor null.

El siguiente ejemplo muestra cómo actualizar un documento encadenando métodos para recuperar y actualizar el primer documento coincidente:

$concert = Concert::where(['performer' => 'Brad Mehldau'])
->orderBy('id')
->first()
->update(['venue' => 'Manchester Arena', 'ticketsSold' => 9543]);

Nota

La orderBy() llamada ordena los resultados según el _id campo para garantizar un orden de clasificación consistente. Para obtener más información sobre la ordenación en MongoDB, consulte la entrada del glosario de orden natural en el manual del servidor.

Cuando el método update() tiene éxito, la operación devuelve el número de documentos actualizados.

Si la parte de recuperación de la llamada no coincide con ningún documento, la integración de Laravel devuelve el siguiente error:

Error: Call to a member function update() on null

Para realizar una actualización en uno o más documentos, encadene el método update() a los resultados de un método que recupere los documentos como un objeto de colección de Laravel, como where().

El siguiente ejemplo muestra cómo encadenar llamadas para recuperar documentos coincidentes y actualizarlos:

Concert::whereIn('venue', ['Philharmonie de Paris', 'Soldier Field'])
->update(['venue' => 'Concertgebouw', 'ticketsSold' => 0]);

Cuando el método update() tiene éxito, la operación devuelve el número de documentos actualizados.

Si la parte de recuperación de la llamada no coincide con ningún documento de la colección, la integración de Laravel devuelve el siguiente error:

Error: Call to a member function update() on null

Una operación upsert permite realizar una actualización o inserción en una sola operación. Esta operación agiliza la tarea de actualizar un documento o insertar uno si no existe.

A partir de v4.7, puede realizar una operación de inserción y actualización mediante cualquiera de los siguientes métodos:

  • upsert():Cuando utiliza este método, puede realizar una inserción y actualización por lotes para cambiar o insertar varios documentos en una sola operación.

  • update()Al usar este método, debe especificar la opción upsert para actualizar todos los documentos que coincidan con el filtro de consulta o insertar un documento si no hay coincidencias. Este método upsert solo es compatible con las versiones v4.6 y anteriores.

El método upsert() acepta los siguientes parámetros:

  • $values:Matriz de campos y valores que especifican documentos para actualizar o insertar.

  • $uniqueBy:Uno o más campos que identifican de forma única los documentos en el primer parámetro de la matriz.

  • $updateMatriz opcional de campos que se actualizan si existe un documento coincidente. Si se omite este parámetro, la integración de Laravel actualiza todos los campos.

Para especificar una inserción o upsert en el método upsert(), pase los parámetros requeridos como se muestra en el siguiente ejemplo de código:

YourModel::upsert(
[/* documents to update or insert */],
'/* unique field */',
[/* fields to update */],
);

Este ejemplo muestra cómo usar el método upsert() para realizar una actualización o inserción en una sola operación. Haga clic en el botón VIEW OUTPUT Botón para ver los cambios de datos resultantes cuando ya hay un documento en el que el valor de performer es 'Angel Olsen' en la colección:

Concert::upsert([
['performer' => 'Angel Olsen', 'venue' => 'Academy of Music', 'ticketsSold' => 275],
['performer' => 'Darondo', 'venue' => 'Cafe du Nord', 'ticketsSold' => 300],
], 'performer', ['ticketsSold']);
{
"_id": "...",
"performer": "Angel Olsen",
"venue": "State Theatre",
"genres": [
"indie",
"rock"
],
"ticketsSold": 275,
"updated_at": ...
},
{
"_id": "...",
"performer": "Darondo",
"venue": "Cafe du Nord",
"ticketsSold": 300,
"updated_at": ...
}

En el documento en el que el valor de performer es 'Angel Olsen', el valor del campo venue no se actualiza, ya que la operación upsert especifica que la actualización se aplica solo al campo ticketsSold.

Para especificar una inserción o actualización en un método update(), configure la opción upsert en true como se muestra en el siguiente ejemplo de código:

YourModel::where(/* match criteria */)
->update(
[/* update data */],
['upsert' => true]);

Cuando el método update() está encadenado a una consulta, realiza una de las siguientes acciones:

  • Si la consulta coincide con documentos, el método update() modifica los documentos coincidentes.

  • Si la consulta no coincide con ningún documento, el método update() inserta un documento que contiene los datos de actualización y los datos de los criterios de coincidencia de igualdad.

Este ejemplo muestra cómo pasar la opción upsert al método update() para realizar una actualización o inserción en una sola operación. Haga clic en el botón VIEW OUTPUT para ver el documento de ejemplo insertado cuando no existen documentos coincidentes:

Concert::where(['performer' => 'Jon Batiste', 'venue' => 'Radio City Music Hall'])
->update(
['genres' => ['R&B', 'soul'], 'ticketsSold' => 4000],
['upsert' => true],
);
{
"_id": "660c...",
"performer": "Jon Batiste",
"venue": "Radio City Music Hall",
"genres": [
"R&B",
"soul"
],
"ticketsSold": 4000,
"updated_at": ...
}

En esta sección, puede ver ejemplos de las siguientes operaciones que actualizan valores de matriz en un documento MongoDB:

Estos ejemplos modifican el documento de muestra creado mediante la siguiente operación de inserción:

Concert::create([
'performer' => 'Mitsuko Uchida',
'genres' => ['classical', 'dance-pop'],
]);

Esta sección muestra cómo usar el método push() para añadir valores a una matriz en un documento MongoDB. Puede pasar uno o más valores para añadir y establecer el parámetro opcional unique en true para omitir la adición de valores duplicados en la matriz. El siguiente ejemplo de código muestra la estructura de una llamada al método push():

YourModel::where(<match criteria>)
->push(
<field name>,
[<values>], // array or single value to add
unique: true); // whether to skip existing values

El siguiente ejemplo muestra cómo agregar el valor "baroque" al campo arreglo genres de un documento que cumpla con la condición. Hacer clic en el botón VIEW OUTPUT para ver el documento actualizado:

Concert::where('performer', 'Mitsuko Uchida')
->push(
'genres',
['baroque'],
);
{
"_id": "660eb...",
"performer": "Mitsuko Uchida",
"genres": [
"classical",
"dance-pop",
],
"updated_at": ...,
"created_at": ...
}

Esta sección muestra cómo utilizar el método pull() para eliminar valores de un arreglo en un documento de MongoDB. Se puede pasar uno o varios valores para remover del arreglo. El siguiente ejemplo de código muestra la estructura de una llamada de método pull():

YourModel::where(<match criteria>)
->pull(
<field name>,
[<values>]); // array or single value to remove

El siguiente ejemplo muestra cómo eliminar los valores de matriz "classical" y "dance-pop" del campo de matriz genres. Haga clic en el botón VIEW OUTPUT para ver el documento actualizado:

Concert::where('performer', 'Mitsuko Uchida')
->pull(
'genres',
['dance-pop', 'classical'],
);
{
"_id": "660e...",
"performer": "Mitsuko Uchida",
"genres": [],
"updated_at": ...,
"created_at": ...
}

Esta sección muestra cómo usar el operador posicional $ para actualizar elementos específicos de un array en un documento MongoDB. El operador $ representa el primer elemento del array que coincide con la consulta. El siguiente ejemplo de código muestra la estructura de una llamada de actualización del operador posicional en un único documento coincidente:

Nota

Actualmente, la integración de Laravel ofrece esta operación solo en la fachada DB y no en el ORM Eloquent.

DB::connection('mongodb')
->getCollection(<collection name>)
->updateOne(
<match criteria>,
['$set' => ['<array field>.$' => <replacement value>]]);

El siguiente ejemplo muestra cómo reemplazar el valor de arreglo "dance-pop" por "contemporary" en el campo de la matriz genres. Haz clic en el botón VIEW OUTPUT para ver el documento actualizado:

$match = ['performer' => 'Mitsuko Uchida', 'genres' => 'dance-pop'];
$update = ['$set' => ['genres.$' => 'contemporary']];
DB::connection('mongodb')
->getCollection('concerts')
->updateOne($match, $update);
{
"_id": "660e...",
"performer": "Mitsuko Uchida",
"genres": [
"classical",
"contemporary"
],
"updated_at": ...,
"created_at": ...
}

Para obtener más información sobre los operadores de actualización de matrices, consulte Operadores de actualización de matrices en el manual del servidor.

Para ver ejemplos de código ejecutable que demuestran cómo actualizar documentos utilizando la integración de Laravel, consulte los siguientes ejemplos de uso:

Para aprender cómo insertar documentos en una colección MongoDB, consulta la guía Insertar documentos.

Volver

Insert

En esta página