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

6 formas de obtener el año a partir de una fecha en MongoDB

MongoDB proporciona bastantes operadores de canalización de agregación para trabajar con fechas. Esto incluye operadores que extraen ciertas partes de fechas, como el año, mes, día, etc.

También hay un par de métodos de MongoDB que le permiten iterar a través de un cursor y aplicar una función de JavaScript. Por lo tanto, esto le permite usar JavaScript para extraer valores de fecha y partes de fecha, etc. de un campo.

Este artículo presenta 6 formas de devolver la parte del año 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 año del born campo de esos documentos.

El $year Operador

El $year operador es la opción más obvia para extraer la parte del año de una fecha. Está diseñado específicamente para devolver un documento con la parte del año de una fecha.

Podemos ejecutar el siguiente código para devolver el año desde el born campo en el documento anterior.

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

Resultado:

{ "birthYear" : 2021 }
{ "birthYear" : 2019 }
{ "birthYear" : 2020 }

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

Ver MongoDB $year 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 año si es necesario.

Hay especificadores de formato para cada parte de la fecha. El %Y especificador de formato devuelve el año.

Ejemplo:

db.cats.aggregate(
   [
     {
       $project: {
         _id: 0,
          birthYear: { $dateToString: { format: "%Y", date: "$born" } }
       }
     }
   ]
)

Resultado:

{ "birthYear" : "2021" }
{ "birthYear" : "2019" }
{ "birthYear" : "2020" }

Podríamos haber proporcionado más especificadores de formato para incluir partes de fecha en el resultado, pero como solo estamos interesados ​​en extraer el año en este artículo, solo usamos un especificador de formato.

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

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 .

Armados con este conocimiento, podemos usar $dateToParts en una etapa de canalización, luego agregue otra etapa de canalización que extraiga el year parte.

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 year campo.

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

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

Resultado:

{ "birthYear" : 2021 }
{ "birthYear" : 2019 }
{ "birthYear" : 2020 }

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 útil.

El $dateToParts el operador también 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 como getFullYear() o getUTCFullYear() para devolver solo el valor del año.

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

Resultado:

2021
2019
2020

Las opciones anteriores devuelven un documento completo que contiene un par nombre/valor. Esta opción devuelve solo el valor del año real y no todo el documento.

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.getFullYear();
    return c;
  }
);

Resultado:

[ 2021, 2019, 2020 ]

El $isoWeekYear Operador

Si necesita devolver el año en formato ISO 8601, use $isoWeekYear . 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,
          birthIsoWeekYear: { $isoWeekYear: "$born" }
        }
    }
  ]
)

Resultado:

{ "birthIsoWeekYear" : NumberLong(2020) }
{ "birthIsoWeekYear" : NumberLong(2019) }
{ "birthIsoWeekYear" : NumberLong(2020) }

Tenga en cuenta que el primer año ahora es 2020 en lugar de 2021 como en los ejemplos anteriores. No todos los años serán diferentes al usar $isoWeekYear , porque depende de la fecha en cuestión.