19 - Tipo de dato Date en MongoDB

Hemos utilizado hasta ahora varios tipos de datos cuando inicializamos campos de un documento:

  • String : Permiten almacenar cadenas de caracteres en formato UTF-8
  • Integer32 : Valores entero numérico
  • Integer64 : Valores entero numérico
  • Double : Almacena valores de punto flotante
  • Object : Almacena un documento embebido
  • Array : Permite almacenar un arreglo con elementos de distinto tipo
  • Boolean : Permite almacenar un valor true o false

Veremos ahora como almacenar datos de tipo Date.

La fecha es un entero de 64 bits que representa el número de milisegundos desde la época de Unix (1 de enero de 1970). Esto da como resultado un intervalo de fechas representables de aproximadamente 290 millones de años en el pasado y el futuro. El tipo Date almacena el signo, un valor negativo representa una fecha anterior a 1970.

Veamos un ejemplo como podemos almacenar un tipo de dato Date tomando la fecha y hora actual del servidor.

Problema

Una playa de estacionamiento cada vez que ingresa un vehículo crea un documento donde almacena la patente y la fecha y hora de ingreso .

use base1
db.autos.drop()

db.autos.insertOne(
  {
    patente : 'aaa111',
    fechahora : new Date()
  }
)
db.autos.insertOne(
  {
    patente : 'bbb222',
    fechahora : new Date()
  }
)
db.autos.insertOne(
  {
    patente : 'ccc333',
    fechahora : new Date()
  }
)

db.autos.find().pretty()

La representación de los datos de tipo Date cuando llamamos al método find es:

MongoDB tipo de dato Date

Para almacenar la fecha se utiliza el estándar ISO 8601 que tiene un formato:
YYYY-MM-DDTHH:MM:SS

Podemos almacenar una fecha particular cuando creamos el objeto de la clase Date:

use base1
db.empleados.drop()

db.empleados.insertOne(
  {
    _id : 20456234,
    nombre : 'Rodriguez Pablo',
    fechaingreso : new Date(2010,0,31)
  }
)
db.empleados.insertOne(
  {
    _id : 17488834,
    nombre : 'Gomez Ana',
    fechaingreso : new Date(2001,11,1)
  }
)
db.empleados.insertOne(
  {
    _id : 23463564,
    nombre : 'Juarez Carla',
    fechaingreso : new Date(2005,3,14)
  }
)

db.empleados.find().pretty()

Como el shell de MongoDB está implementado en JavaScript debemos indicar al crear un objeto dee la clase Data para el mes un valor comprendido entre 0 y 11.

Podemos ver las fechas almacenadas en el campo 'fechaingreso', y que la parte de la hora está en cero por no pasarlas cuando creamos el objeto de la clase Date:

MongoDB tipo de dato Date

Si necesitamos que los datos de empleados se recuperen en forma ordenada por el campo 'fechaingreso' debemos codificar la siguiente consulta:

db.empleados.find().pretty().sort({fechaingreso:1})

Problemas propuestos

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

    use base1
    
    db.alumnos.drop()
    
    db.alumnos.insertOne(
      {
        _id: 20456123,
        apellido: 'Gonzalez',
        nombre: 'Ana',
        domicilio: 'Colon 123',
        fechanacimiento: new Date(1990,7,15) 
      }
    )
    db.alumnos.insertOne(
      {
        _id: 45123845,
        apellido: 'Juarez',
        nombre: 'Bernardo',
        domicilio: 'Sucre 456',
        fechanacimiento: new Date(1964,0,1) 
      }
    )
    db.alumnos.insertOne(
      {
        _id: 16567512,
        apellido: 'Perez',
        nombre: 'Laura',
        domicilio: '21 de Septiembre 3233',
        fechanacimiento: new Date(1972,3,2) 
      }
    )
    
    db.alumnos.find().pretty()
    
    
  2. Imprimir todos los documentos de la colección alumnos.

  3. Imprimir solo el apellido y la fecha de nacimiento.

  4. Imprimir todos los datos ordenados por la fecha de nacimiento de mayor a menor.

  5. Imprimir todos los alumnos que nacieron a partir de 1970.

Solución

use base1

db.alumnos.drop()

db.alumnos.insertOne(
  {
    _id: 20456123,
    apellido: 'Gonzalez',
    nombre: 'Ana',
    domicilio: 'Colon 123',
    fechanacimiento: new Date(1990,7,15) 
  }
)
db.alumnos.insertOne(
  {
    _id: 45123845,
    apellido: 'Juarez',
    nombre: 'Bernardo',
    domicilio: 'Sucre 456',
    fechanacimiento: new Date(1964,0,1) 
  }
)
db.alumnos.insertOne(
  {
    _id: 16567512,
    apellido: 'Perez',
    nombre: 'Laura',
    domicilio: '21 de Septiembre 3233',
    fechanacimiento: new Date(1972,3,2) 
  }
)

db.alumnos.find().pretty()

db.alumnos.find({}, {apellido:1,fechanacimiento:1,_id:0}).pretty()

db.alumnos.find().pretty().sort({fechanacimiento:-1})

db.alumnos.find({fechanacimiento:{$gte:new Date(1970,0,1)}}).pretty()