9 - Operadores relacionales $eq, $gt, $gte, $lt, $lte, $in, $nin y $ne

En el concepto anterior vimos como podemos seleccionar mediante el método find algunos documentos que cumplen una condición.

Recordemos con un ejemplo como recuperar todos los libros con un precio igual a 50:

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({ precio: 50 })

Es decir que cuando llamamos al método find pasamos un objeto literal pasando en el campo precio el valor 50, luego el método find filtra todos los libros cuyo precio sean exactamente igual a 50.

Otra forma de expresar la búsqueda de todos los libros con un precio igual a 50 es:

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

Es decir que luego del campo precio pasamos otro objeto literal iniciando el operador $eq con el valor 50.

Mostramos esta segunda forma de consultar todos los libros con un precio igual a 50 debido a que cuando tenemos que consultar por ejemplo los libros con un precio inferior a 50, o superior a 50 etc. debemos indicar en forma obligatoria el operador a utilizar.

Para mostrar todos los libros con un precio inferior a 30 tenemos que utilizar el operador $lt:

db.libros.find({ precio: { $lt : 30 } })

Tenemos luego como resultado con los datos ya cargados en la colección libros:

MongoDB operadores relacionales

Hay un solo libro que tiene un precio menor a 30.

Listado de operadores relacionales

  • $eq - equal - igual
  • $lt - low than - menor que
  • $lte - low than equal - menor o igual que
  • $gt - greater than - mayor que
  • $gte - greater than equal - mayor o igual que
  • $ne - not equal - distinto
  • $in - in - dentro de
  • $nin - not in - no dentro de

Veamos con algunos ejemplos como utilizar estos operadores para recuperar documentos que cumplen determinadas condiciones.

Recuperar todos los libros que tienen un precio mayor a 40:

db.libros.find({ precio: { $gt:40 }})

Recuperar todos los libros que en le campo cantidad tiene 50 o más:

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

Recuperar todos los libros que en le campo cantidad hay un valor distinto a 50:

db.libros.find( { cantidad: { $ne : 50 }})

Recuperar todos los libros cuyo precio estén comprendidos entre 20 y 45:

db.libros.find( { precio: { $gte : 20 , $lte : 45} })

Recuperar todos los libros de la editorial 'Planeta':

db.libros.find( { editorial: { $in : ['Planeta'] } })

Recuperar todos los libros que no pertenezcan a la editorial 'Planeta':

db.libros.find( { editorial: { $nin : ['Planeta'] } })

Hay que acostumbrarse en un principio a utilizar estos operados para filtrar documentos de una colección, luego veremos que estos operadores también se emplean cuando efectuemos borrados y modificaciones de documentos.

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. Imprimir todos los documentos de la colección 'articulos' que no son impresoras.

  4. Imprimir todos los artículos que pertenecen al rubro de 'mouse'.

  5. Imprimir todos los artículos con un precio mayor o igual a 5000.

  6. Imprimir todas las impresoras que tienen un precio mayor o igual a 3500.

  7. Imprimir todos los artículos cuyo stock se encuentra comprendido entre 0 y 4.

Solución
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
  }
)

db.articulos.find()

db.articulos.find({ rubro : {$ne: 'impresora'} })

db.articulos.find({ rubro : {$eq: 'mouse'} })

db.articulos.find({ precio : {$gte: 5000} })

db.articulos.find({ rubro : {$eq: 'impresora'}, precio : { $gte: 3500 } })

db.articulos.find({ stock : {$gte: 0, $lte: 4} })