12 - Modificar múltiples documentos con el método updateMany

Vimos en el concepto anterior que MongoDB nos provee de un método que nos permite modificar un único documento llamado updateOne.

El segundo método que nos permite actualizar documentos pero en forma masiva es el método updateMany.

Veamos con un ejemplo algunas variantes del método updateMany:

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.updateMany({_id : {$gt:2}} , {$set : {cantidad:0} })

db.libros.find()

db.libros.updateMany({cantidad : {$eq:0}} , {$set : {faltantes:true} })

db.libros.find()

db.libros.updateMany({cantidad : {$eq:0}} , {$unset : {faltantes:true}, $set:{cantidad: 100}} )

db.libros.find()

La primer modificación masiva la hacemos con todos los libros cuyo _id sean mayores a 2, fijando el campo cantidad con 0:

MongoDB método updateMany

La segunda modificación masiva la hacemos con todos los libros que almacenan en el campo 'cantidad' el valor cero, agregando el campo 'faltantes' con el valor true:

MongoDB método updateMany

La tercer y última modificación masiva la hacemos con todos los libros que almacenan en el campo 'cantidad' el valor cero, eliminamos el campo faltantes y fijamos el campo cantidad con el valor 100:

MongoDB método updateMany

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. Fijar el stock en cero para todos los artículos del rubro monitor.

  4. Agregar un campo llamado 'pedir' con el valor true para todos los artículos que tienen el campo stock en 0.

  5. Eliminar el campo 'pedir' de todos los documentos

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.updateMany({ rubro: {$eq:'monitor'}} , {$set: {stock:0}} )

db.articulos.find()

db.articulos.updateMany({ stock: {$eq:0}} , {$set: {pedir:true}} )

db.articulos.find()

db.articulos.updateMany({} , {$unset: {pedir:''}} )

db.articulos.find()