MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

6 modi per ottenere l'anno da una data in MongoDB

MongoDB fornisce alcuni operatori di pipeline di aggregazione per lavorare con le date. Ciò include gli operatori che estraggono determinate parti di date, come l'anno, il mese, il giorno, ecc.

Esistono anche un paio di metodi MongoDB che consentono di scorrere un cursore e applicare una funzione JavaScript. Ciò consente quindi di utilizzare JavaScript per estrarre valori di data e parti di data, ecc. Da un campo.

Questo articolo presenta 6 modi per restituire la parte dell'anno da una data in MongoDB.

Dati di esempio

Supponiamo di avere una collezione chiamata cats con i seguenti documenti:

{ "_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") }

Gli esempi seguenti mostrano varie opzioni per restituire la parte dell'anno dal born campo di quei documenti.

Il $year Operatore

Il $year operatore è la scelta più ovvia per estrarre la parte dell'anno da una data. È progettato specificamente per restituire un documento con la parte dell'anno di una data.

Possiamo eseguire il codice seguente per restituire l'anno dal born campo nel documento sopra.

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

Risultato:

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

Puoi anche specificare il fuso orario quando usi $year operatore.

Vedi MongoDB $year per ulteriori informazioni ed esempi.

Il $dateToString Operatore

Il $dateToString operatore converte un oggetto data in una stringa in base a un formato specificato dall'utente. L'utente può quindi specificare che, se richiesto, viene restituita solo la quota dell'anno.

Sono disponibili identificatori di formato per ciascuna parte della data. Il %Y l'identificatore di formato restituisce l'anno.

Esempio:

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

Risultato:

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

Avremmo potuto fornire più identificatori di formato per includere le parti della data nel risultato, ma poiché in questo articolo siamo interessati solo all'estrazione dell'anno, abbiamo utilizzato un solo identificatore di formato.

Vedi MongoDB $dateToString per ulteriori informazioni ed esempi.

Il $dateToParts Operatore

Il $dateToParts l'operatore restituisce un documento che contiene le parti costitutive di un dato valore BSON Date come singole proprietà. Le proprietà restituite sono year , month , day , hour , minute , second e millisecond .

Forti di questa conoscenza, possiamo usare $dateToParts in una fase della pipeline, quindi aggiungi un'altra fase della pipeline che estrae l'year parte.

Ecco cosa $dateToParts resi per i nostri tre documenti:

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

Risultato:

{
	"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
	}
}

Questi dati possono essere passati alla fase successiva della pipeline per estrarre solo l'year campo.

Ecco cosa succede se aggiungiamo un'altra proiezione solo per l'year campo:

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

Risultato:

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

Questo ovviamente non è così conciso come usare le opzioni precedenti. Tuttavia, a seconda di ciò che stai facendo nella tua pipeline, questo approccio potrebbe essere un'opzione utile.

Il $dateToParts l'operatore accetta anche un iso8601 parametro, che modifica il documento di output in modo che utilizzi i campi della data della settimana ISO.

Vedi MongoDB $dateToParts per ulteriori informazioni ed esempi.

Il forEach() Metodo

Puoi usare cursor.forEach() per scorrere il cursore, utilizzando un metodo JavaScript come getFullYear() o getUTCFullYear() per restituire solo il valore dell'anno.

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

Risultato:

2021
2019
2020

Le opzioni precedenti restituiscono un intero documento che contiene una coppia nome/valore. Questa opzione restituisce solo il valore dell'anno effettivo e non l'intero documento.

La map() Metodo

Il cursor.map() applica una funzione a ogni documento visitato dal cursore e combina i valori in un array.

Esempio:

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

Risultato:

[ 2021, 2019, 2020 ]

Il $isoWeekYear Operatore

Se devi restituire l'anno nel formato ISO 8601, usa $isoWeekYear . L'anno ISO 8601 inizia con il lunedì della settimana 1 e termina con la domenica dell'ultima settimana.

Esempio:

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

Risultato:

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

Si noti che il primo anno è ora il 2020 invece del 2021 come negli esempi precedenti. Non tutti gli anni saranno diversi quando si utilizza $isoWeekYear , perché dipende dalla data in questione.