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}}] })