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:
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.
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 } )
Imprimir todos los documentos de la colección 'medicamentos'.
Recupere los medicamentos cuyo laboratorio sea 'Roche' y cuyo precio sea menor a 5.
Recupere los medicamentos cuyo laboratorio sea 'Roche' o cuyo precio sea menor a 5.
Muestre todos los medicamentos cuyo laboratorio NO sea "Bayer"
Muestre todos los medicamentos cuyo laboratorio sea "Bayer" y cuya cantidad NO sea=100
Elimine todos los documentos de la colección medicamentos cuyo laboratorio sea igual a "Bayer" y su precio sea mayor a 10
Cambie la cantidad por 200, a todos los medicamentos de "Roche" cuyo precio sea mayor a 5
Borre los medicamentos cuyo laboratorio sea "Bayer" o cuyo precio sea menor a 3
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}}] })