11 - Modificar un documento mediante el método updateOne

Hemos visto en conceptos anteriores como insertar un documento en una colección, recuperar un documento, borrar un documento y nos está faltando otra operación fundamental que podemos hacer con un documento que es su modificación.

Para modificar un documento en particular disponemos de un método llamado updateOne, veamos con un ejemplo algunas de sus posibilidades:

use base1
db.libros.drop()

db.libros.insertOne(
  {
    _id: 1,  
    titulo: 'El aleph',
    autor: 'Borges',
    editorial: ['Siglo XXI','Planeta'],
    precio: 20,
    cantidad: 50 
  }
)
db.libros.insertOne(
  {
    _id: 2,  
    titulo: 'Martin Fierro',
    autor: 'Jose Hernandez',
    editorial: ['Siglo XXI'],
    precio: 50,
    cantidad: 12
  }
)
db.libros.insertOne(
  {
    _id: 3,  
    titulo: 'Aprenda PHP',
    autor: 'Mario Molina',
    editorial: ['Siglo XXI','Planeta'],
    precio: 50,
    cantidad: 20
  }
)
db.libros.insertOne(
  {
    _id: 4,  
    titulo: 'Java en 10 minutos',
    editorial: ['Siglo XXI'],
    precio: 45,
    cantidad: 1 
  }
)

db.libros.find()

db.libros.updateOne({_id : {$eq:1}} , {$set : {precio:15,cantidad:1} })

db.libros.find()

Hemos llamado al método updateOne con dos parámetros, el primero indica el documento a modificar y el segundo parámetro utilizamos el operador $set que es un operador de actualización seguidamente con los campos y valores a modificar.

Si existe el documento con _id igual a 1 luego se modifican los campos precio y cantidad:

MongoDB método updateOne

Con las bases de datos documentales tengamos en cuenta que los documentos pueden tener distintas cantidades de campos. Por ejemplo si queremos agregar el campo descripción al libro con '_id' 4 debemos utilizar la sintaxis:

db.libros.updateOne({_id: {$eq:4}} ,{$set : {descripcion: 'Cada unidad trata un tema fundamental de Java desde 0.'} })

Luego de ejecutar tenemos el documento con _id 4 que contiene un nuevo campo llamado 'descripcion' con el valor 'Cada unidad trata un tema fundamental de Java desde 0.':

MongoDB método updateOne

Si queremos eliminar un campo de un documento debemos emplear el operador de actualización $unset. Probemos ahora de eliminar el campo que acabamos de crear para el documento con _id 4:

db.libros.updateOne({_id : {$eq:4}} , {$unset : {descripcion:''} })

Luego de ejecutar el updateOne tenemos que para el documento que tiene el _id 4 se ha eliminado el campo 'descripcion':

MongoDB método updateOne

Es importante entender que mediante el operador $unset eliminamos el campo, en cambio si utilizamos el operador $set modificamos el contenido del campo, luego si ejecutamos:

db.libros.updateOne({_id : {$eq:4}} , {$set : {descripcion:''} })

El campo 'descripcion' sigue existiendo y almacena una cadena de texto vacía, y si no existía se crea con una cadena vacía.

Disponemos también de operadores de modificación para arreglos, veamos como podemos agregar y eliminar elementos en el arreglo 'editorial':

use base1
db.libros.drop()

db.libros.insertOne(
  {
    _id: 1,  
    titulo: 'El aleph',
    autor: 'Borges',
    editorial: ['Siglo XXI','Planeta'],
    precio: 20,
    cantidad: 50 
  }
)
db.libros.insertOne(
  {
    _id: 2,  
    titulo: 'Martin Fierro',
    autor: 'Jose Hernandez',
    editorial: ['Siglo XXI'],
    precio: 50,
    cantidad: 12
  }
)
db.libros.insertOne(
  {
    _id: 3,  
    titulo: 'Aprenda PHP',
    autor: 'Mario Molina',
    editorial: ['Siglo XXI','Planeta'],
    precio: 50,
    cantidad: 20
  }
)
db.libros.insertOne(
  {
    _id: 4,  
    titulo: 'Java en 10 minutos',
    editorial: ['Siglo XXI'],
    precio: 45,
    cantidad: 1 
  }
)

db.libros.find()

db.libros.updateOne({_id : {$eq:1}} , {$push : {editorial:'Atlántida'} })

db.libros.find()

Podemos ver que luego de ejecutarse el método updateOne el arreglo 'editorial' tiene una nueva componente para el documento con _id 1:

MongoDB método updateOne con array

De forma similar para eliminar un elemento del arreglo debemos emplear el operador $pull:

db.libros.updateOne({_id : {$eq:1}} , {$pull : {editorial:'Atlántida'} })

Podemos consultar todos los operadores de modificación en la página oficial de MongoDB.

Problemas propuestos

  1. Crear la colección 'articulos' en la base de datos 'base1' (eliminar la colección previamente), cargar luego 6 documentos:

    use base1
    db.articulos.drop()
    
    db.articulos.insertOne(
      {
        _id: 1,  
        nombre: 'MULTIFUNCION HP DESKJET 2675',
        rubro: 'impresora',
        precio: 3000,
        stock: 20 
      }
    )
    db.articulos.insertOne(
      {
        _id: 2,  
        nombre: 'MULTIFUNCION EPSON EXPRESSION XP241',
        rubro: 'impresora',
        precio: 3700,
        stock: 5 
      }
    )
    db.articulos.insertOne(
      {
        _id: 3,  
        nombre: 'LED 19 PHILIPS',
        rubro: 'monitor',
        precio: 4500,
        stock: 2
      }
    )
    db.articulos.insertOne(
      {
        _id: 4,  
        nombre: 'LED 22 PHILIPS',
        rubro: 'monitor',
        precio: 5700,
        stock: 4
      }
    )
    db.articulos.insertOne(
      {
        _id: 5,  
        nombre: 'LED 27 PHILIPS',
        rubro: 'monitor',
        precio: 12000,
        stock: 1
      }
    )
    
    db.articulos.insertOne(
      {
        _id: 6,  
        nombre: 'LOGITECH M90',
        rubro: 'mouse',
        precio: 300,
        stock: 4
      }
    )
    
    
  2. Imprimir todos los documentos de la colección 'articulos'.

  3. Modificar el precio del mouse 'LOGITECH M90'.

  4. Fijar el stock en 0 del artículo cuyo _id es 6.

  5. Agregar el campo proveedores con el array ['Martinez','Gutierrez'] para el artículo cuyo _id es 6.

  6. Eliminar el campo proveedores para el artículo cuyo _id es 6.

Solución

db.articulos.drop()

db.articulos.insertOne(
  {
    _id: 1,  
    nombre: 'MULTIFUNCION HP DESKJET 2675',
    rubro: 'impresora',
    precio: 3000,
    stock: 20 
  }
)
db.articulos.insertOne(
  {
    _id: 2,  
    nombre: 'MULTIFUNCION EPSON EXPRESSION XP241',
    rubro: 'impresora',
    precio: 3700,
    stock: 5 
  }
)
db.articulos.insertOne(
  {
    _id: 3,  
    nombre: 'LED 19 PHILIPS',
    rubro: 'monitor',
    precio: 4500,
    stock: 2
  }
)
db.articulos.insertOne(
  {
    _id: 4,  
    nombre: 'LED 22 PHILIPS',
    rubro: 'monitor',
    precio: 5700,
    stock: 4
  }
)
db.articulos.insertOne(
  {
    _id: 5,  
    nombre: 'LED 27 PHILIPS',
    rubro: 'monitor',
    precio: 12000,
    stock: 1
  }
)

db.articulos.insertOne(
  {
    _id: 6,  
    nombre: 'LOGITECH M90',
    rubro: 'mouse',
    precio: 300,
    stock: 4
  }
)

db.articulos.find()

db.articulos.updateOne({ nombre: {$eq:'LOGITECH M90'}} , {$set: {precio:500}} )

db.articulos.find()

db.articulos.updateOne({ _id: {$eq:6}} , {$set: {stock:0}} )

db.articulos.find()

db.articulos.updateOne({ _id: {$eq:6}} , {$set: {proveedores:['Martinez','Gutierrez']}} )

db.articulos.find()

db.articulos.updateOne({ _id: {$eq:6}} , {$unset: {proveedores:''}} )

db.articulos.find()