13 - Operadores lógicos $and, $or y $not

Cuando necesitamos construir consultas que deban cumplir varias condiciones utilizaremos los operadores lógicos.

El operador $and lo hemos utilizando en forma implícita, por ejemplo si tenemos:

db.libros.find({precio : 50, cantidad : 20 }) 

Con la condición anterior se recuperan todos los libros que tienen un precio de 50 y la cantidad es 20. Las dos condiciones deben ser verdaderas para que el documento se recupere.

La sintaxis alternativa para el find es:

db.libros.find({$and : [{precio:50}, {cantidad:20}]  })

El valor para el operador $and es un arreglo con cada una de las condiciones que debe cumplir.

Para los operadores $or y $not no hay una forma de disponer una sintaxis implícita.

Veamos con ejemplos el empleo de los operadores $or y $not:

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.find({$or: [{precio:{$gte:50}}, {cantidad:1} ]})

Para recuperar los libros que tienen un precio mayor o igual a 50 o la cantidad es 1 debemos implementar mediante un $or la siguiente sintaxis:

db.libros.find({$or: [{precio:{$gte:50}}, {cantidad:1} ]})

Hay tres documentos que cumplen la condición:

MongoDB operador $or

Si queremos recuperar todos los documentos de la colección libros que no tienen un precio mayor o igual a 50 la sintaxis debe ser:

db.libros.find({precio: {$not:{$gte:50}} })

Los operadores lógicos podemos utilizarlos no solo para recuperar datos, sino también cuando borramos o actualizamos documentos.

Si queremos borrar todos los libros cuyo precio no sean iguales a 50 podemos codificar:

db.libros.deleteMany({precio: {$not:{$eq:50}} })

Se eliminan dos documentos de la colección libros.

Problemas propuestos

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

    use base1
    db.medicamentos.drop()
    
    db.medicamentos.insertOne(
      {
        _id: 1,  
        nombre: 'Sertal',
        laboratorio: 'Roche',
        precio: 5.2,
        cantidad: 100  
      }
    )
    db.medicamentos.insertOne(
      {
        _id: 2,  
        nombre: 'Buscapina',
        laboratorio: 'Roche',
        precio: 4.10,
        cantidad: 200 
      }
    )
    db.medicamentos.insertOne(
      {
        _id: 3,  
        nombre: 'Amoxidal 500',
        laboratorio: 'Bayer',
        precio: 15.60,
        cantidad: 100 
      }
    )
    db.medicamentos.insertOne(
      {
        _id: 4,  
        nombre: 'Paracetamol 500',
        laboratorio: 'Bago',
        precio: 1.90,
        cantidad: 200 
      }
    )
    db.medicamentos.insertOne(
      {
        _id: 5,  
        nombre: 'Bayaspirina',
        laboratorio: 'Bayer',
        precio: 2.10,
        cantidad: 150 
      }
    )
    db.medicamentos.insertOne(
      {
        _id: 6,  
        nombre: 'Amoxidal jarabe',
        laboratorio: 'Bayer',
        precio: 5.10,
        cantidad: 50 
      }
    )
    
    
  2. Imprimir todos los documentos de la colección 'medicamentos'.

  3. Recupere los medicamentos cuyo laboratorio sea 'Roche' y cuyo precio sea menor a 5.

  4. Recupere los medicamentos cuyo laboratorio sea 'Roche' o cuyo precio sea menor a 5.

  5. Muestre todos los medicamentos cuyo laboratorio NO sea "Bayer"

  6. Muestre todos los medicamentos cuyo laboratorio sea "Bayer" y cuya cantidad NO sea=100

  7. Elimine todos los documentos de la colección medicamentos cuyo laboratorio sea igual a "Bayer" y su precio sea mayor a 10

  8. Cambie la cantidad por 200, a todos los medicamentos de "Roche" cuyo precio sea mayor a 5

  9. Borre los medicamentos cuyo laboratorio sea "Bayer" o cuyo precio sea menor a 3

Solución

use base1
db.medicamentos.drop()

db.medicamentos.insertOne(
  {
    _id: 1,  
    nombre: 'Sertal',
    laboratorio: 'Roche',
    precio: 5.2,
    cantidad: 100  
  }
)
db.medicamentos.insertOne(
  {
    _id: 2,  
    nombre: 'Buscapina',
    laboratorio: 'Roche',
    precio: 4.10,
    cantidad: 200 
  }
)
db.medicamentos.insertOne(
  {
    _id: 3,  
    nombre: 'Amoxidal 500',
    laboratorio: 'Bayer',
    precio: 15.60,
    cantidad: 100 
  }
)
db.medicamentos.insertOne(
  {
    _id: 4,  
    nombre: 'Paracetamol 500',
    laboratorio: 'Bago',
    precio: 1.90,
    cantidad: 200 
  }
)
db.medicamentos.insertOne(
  {
    _id: 5,  
    nombre: 'Bayaspirina',
    laboratorio: 'Bayer',
    precio: 2.10,
    cantidad: 150 
  }
)
db.medicamentos.insertOne(
  {
    _id: 6,  
    nombre: 'Amoxidal jarabe',
    laboratorio: 'Bayer',
    precio: 5.10,
    cantidad: 50 
  }
)

db.medicamentos.find()

db.medicamentos.find({laboratorio:'Roche',precio:{$lt:5}})

db.medicamentos.find({ $or:[{laboratorio:'Roche'} , {precio:{$lt:5}}] })

db.medicamentos.find({laboratorio: {$not:{$eq:'Bayer'}} })

db.medicamentos.find({laboratorio:'Bayer',cantidad:{$not:{$eq:100}}})

db.medicamentos.deleteMany({laboratorio:'Bayer',precio:{$gt:10}})

db.medicamentos.updateMany({laboratorio :'Roche', precio: {$gt: 5} } , {$set : {cantidad:200} })

db.medicamentos.deleteMany({ $or:[{laboratorio:'Bayer'},{precio:{$lt:3}}] })