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.