sql >> Base de Datos >  >> NoSQL >> MongoDB

8 formas de obtener el día a partir de una fecha en MongoDB

A la hora de extraer el día de una fecha, la opción exacta que utilicemos dependerá de cómo queramos que se represente el día.

Por ejemplo, ¿queremos el día de la semana, el día del mes o el día del año? ¿O tal vez lo queremos en formato ISO 8601? El valor de retorno normalmente será diferente dependiendo de cuál elijamos.

Este artículo explora esas opciones y, por lo tanto, presenta 8 formas de devolver la parte del día de una fecha en MongoDB.

Datos de muestra

Supongamos que tenemos una colección llamada cats con los siguientes documentos:

{ "_id" : 1, "name" : "Scratch", "born" : ISODate("2021-01-03T23:30:15.123Z") }
{ "_id" : 2, "name" : "Meow", "born" : ISODate("2019-12-08T04:00:12Z") }
{ "_id" : 3, "name" : "Fluffy", "born" : ISODate("2020-09-24T10:30:00Z") }

Los siguientes ejemplos muestran varias opciones para devolver la parte del día del born campo de esos documentos.

El $dayOfWeek Operador

Como su nombre lo indica, el $dayOfWeek operador devuelve el día de la semana a partir de una fecha.

Podemos ejecutar el siguiente código para devolver el día de la semana del born campo en el documento anterior.

db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          birthDayOfWeek: { $dayOfWeek: "$born" }
        }
    }
  ]
)

Resultado:

{ "birthDayOfWeek" : 1 }
{ "birthDayOfWeek" : 1 }
{ "birthDayOfWeek" : 5 }

También es posible especificar la zona horaria al usar $dayOfWeek operador.

Ver MongoDB $dayOfWeek para más información y ejemplos.

El $dayOfMonth Operador

El $dayOfMonth operador devuelve el día del mes a partir de una fecha.

Ejemplo:

db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          birthDayOfMonth: { $dayOfMonth: "$born" }
        }
    }
  ]
)

Resultado:

{ "birthDayOfMonth" : 3 }
{ "birthDayOfMonth" : 8 }
{ "birthDayOfMonth" : 24 }

También puede especificar la zona horaria al usar el $dayOfMonth operador.

Ver MongoDB $dayOfMonth para más información y ejemplos.

El $dayOfYear Operador

Sí, lo has adivinado. El $dayOfYear operador devuelve el día del año a partir de una fecha.

Ejemplo:

db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          birthDayOfYear: { $dayOfYear: "$born" }
        }
    }
  ]
)

Resultado:

{ "birthDayOfYear" : 3 }
{ "birthDayOfYear" : 342 }
{ "birthDayOfYear" : 268 }

El $dayOfYear el operador también acepta un parámetro de zona horaria.

Ver MongoDB $dayOfYear para más información y ejemplos.

El $dateToString Operador

El $dateToString El operador convierte un objeto de fecha en una cadena de acuerdo con un formato especificado por el usuario. Por lo tanto, el usuario puede especificar que solo se devuelva la parte del día si es necesario.

Hay especificadores de formato para cada parte de la fecha y, cuando se trata de la parte del día, puede elegir entre los especificadores de formato que dependerán de si desea devolver el día de la semana, el día del mes, el día del año o el día de la semana en formato ISO 8601.

Ejemplo:

db.cats.aggregate(
   [
     {
       $project: {
         _id: 0,
          birthDayOfWeek: { $dateToString: { format: "%w", date: "$born" } },
          birthDayOfMonth: { $dateToString: { format: "%d", date: "$born" } },
          birthDayOfYear: { $dateToString: { format: "%j", date: "$born" } },
          birthDayOfWeekISO: { $dateToString: { format: "%u", date: "$born" } }
       }
     }
   ]
).pretty()

Resultado:

{
	"birthDayOfWeek" : "1",
	"birthDayOfMonth" : "03",
	"birthDayOfYear" : "003",
	"birthDayOfWeekISO" : "7"
}
{
	"birthDayOfWeek" : "1",
	"birthDayOfMonth" : "08",
	"birthDayOfYear" : "342",
	"birthDayOfWeekISO" : "7"
}
{
	"birthDayOfWeek" : "5",
	"birthDayOfMonth" : "24",
	"birthDayOfYear" : "268",
	"birthDayOfWeekISO" : "4"
}

Podríamos haber proporcionado más especificadores de formato para incluir otras partes de la fecha en el resultado, pero como solo estamos interesados ​​en extraer el día en este artículo, solo usamos especificadores de formato para devolver la parte del día.

Ver MongoDB $dateToString para más información y ejemplos.

Ver también MongoDB $dateToString Especificadores de formato para obtener una lista de especificadores de formato que puede usar con $dateToString .

El $dateToParts Operador

El $dateToParts El operador devuelve un documento que contiene las partes constituyentes de un valor de fecha BSON dado como propiedades individuales. Las propiedades devueltas son year , month , day , hour , minute , second y millisecond .

Por lo tanto, podemos usar $dateToParts en una etapa de canalización, luego agregue otra etapa de canalización que extraiga el day parte si es necesario.

Esto es lo que $dateToParts devoluciones de nuestros tres documentos:

db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          dateParts: { $dateToParts: { date: "$born" } }
        }
    }
  ]
).pretty()

Resultado:

{
	"dateParts" : {
		"year" : 2021,
		"month" : 1,
		"day" : 3,
		"hour" : 23,
		"minute" : 30,
		"second" : 15,
		"millisecond" : 123
	}
}
{
	"dateParts" : {
		"year" : 2019,
		"month" : 12,
		"day" : 8,
		"hour" : 4,
		"minute" : 0,
		"second" : 12,
		"millisecond" : 0
	}
}
{
	"dateParts" : {
		"year" : 2020,
		"month" : 9,
		"day" : 24,
		"hour" : 10,
		"minute" : 30,
		"second" : 0,
		"millisecond" : 0
	}
}

Estos datos se pueden pasar a la siguiente etapa de la canalización para extraer solo el day campo.

Esto es lo que sucede si agregamos otra proyección solo para el day campo:

db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          dateParts: { $dateToParts: { date: "$born" } }
        }
    },
    {
      $project:
        {
          birthDay: "$dateParts.day"
        }
    }
  ]
)

Resultado:

{ "birthDay" : 3 }
{ "birthDay" : 8 }
{ "birthDay" : 24 }

Obviamente, esto no es tan conciso como usar las opciones anteriores. Sin embargo, dependiendo de lo que esté haciendo en su embudo, este enfoque podría ser una opción.

También vale la pena mencionar que $dateToParts acepta un iso8601 parámetro, que modifica el documento de salida para usar campos de fecha de semana ISO.

Ver MongoDB $dateToParts para más información y ejemplos.

El forEach() Método

Puedes usar cursor.forEach() para iterar a través del cursor, usando un método de JavaScript para devolver solo el valor del día.

db.cats.find().forEach(
  function(c) {
    print(
      c.born.getDay()
      );
  }
);

Resultado:

1
0
4

En este caso, usamos JavaScript getDay() método, que devuelve un número entero, entre 0 y 6, correspondiente al día de la semana para la fecha dada, según la hora local.

Otra opción es usar el getUTCDay() método, que utiliza el tiempo universal. Usaremos este método en el siguiente ejemplo.

Alternativamente, podríamos haber usado JavaScript getDate() método, que devuelve un número entero, entre 1 y 31, que representa el día del mes para la fecha dada.

Además, esta opción devuelve solo el valor del día real y no el documento completo, como en los ejemplos anteriores.

El map() Método

El cursor.map() El método aplica una función a cada documento visitado por el cursor y combina los valores en una matriz.

Ejemplo:

db.cats.find().map(
  function(c) {
    c = c.born.getUTCDay();
    return c;
  }
);

Resultado:

[ 0, 0, 4 ]

Como se mencionó, JavaScript getUTCDay() método devuelve su resultado utilizando el tiempo universal. En este caso, se devolvió un valor diferente para el primer documento (obtuvimos 0 en este ejemplo, frente a 1 en el anterior).

El $isoDayOfWeek Operador

Si necesita devolver el día de la semana en formato ISO 8601, puede usar $isoDayOfWeek . El año ISO 8601 comienza el lunes de la semana 1 y finaliza el domingo de la última semana.

Ejemplo:

db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          birthIsoDayOfWeek: { $isoDayOfWeek: "$born" }
        }
    }
  ]
)

Resultado:

{ "birthIsoDayOfWeek" : 7 }
{ "birthIsoDayOfWeek" : 7 }
{ "birthIsoDayOfWeek" : 4 }

En este caso, obtenemos un resultado completamente diferente al que obtuvimos cuando usamos $dayOfWeek operador, debido a la forma en que ISO 8601 calcula las fechas.

Aquí hay un ejemplo que demuestra esta diferencia:

db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          birthDayOfWeek: { $dayOfWeek: "$born" },
          birthIsoDayOfWeek: { $isoDayOfWeek: "$born" }
        }
    }
  ]
)

Resultado:

{ "birthDayOfWeek" : 1, "birthIsoDayOfWeek" : 7 }
{ "birthDayOfWeek" : 1, "birthIsoDayOfWeek" : 7 }
{ "birthDayOfWeek" : 5, "birthIsoDayOfWeek" : 4 }