MongoDB offre una buona gamma di operatori di pipeline di aggregazione per lavorare con le date, inclusi gli operatori che estraggono determinate parti di date, come anno, mese, giorno, ore, minuti, ecc.
Esistono anche un paio di metodi MongoDB che consentono di scorrere un cursore e applicare una funzione JavaScript. È quindi possibile utilizzare JavaScript per estrarre valori di data e parti di data, ecc. Da un campo come richiesto.
Questo articolo presenta 5 modi per restituire la parte dell'ora da un oggetto Date 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'ora da born
campo di quei documenti.
Il $hour
Operatore
Il $hour
l'operatore è progettato specificamente per restituire un documento con la parte dell'ora di una determinata data.
Possiamo eseguire il codice seguente per restituire la parte dell'ora da born
campo nel documento sopra.
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthHour: { $hour: "$born" }
}
}
]
)
Risultato:
{ "birthHour" : 23 } { "birthHour" : 4 } { "birthHour" : 10 }
Puoi anche specificare il fuso orario quando usi il $hour
operatore.
Vedi MongoDB $hour
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 venga restituita solo la parte dell'ora, se richiesta.
Sono disponibili identificatori di formato per ciascuna parte della data. Il %H
l'identificatore di formato restituisce l'ora.
Esempio:
db.cats.aggregate(
[
{
$project: {
_id: 0,
birthHour: { $dateToString: { format: "%H", date: "$born" } }
}
}
]
)
Risultato:
{ "birthHour" : "23" } { "birthHour" : "04" } { "birthHour" : "10" }
Avremmo potuto fornire più identificatori di formato per includere parti di data nel risultato, ma visto che in questo articolo siamo interessati solo all'estrazione dell'ora, 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
.
Potremmo quindi utilizzare $dateToParts
in una fase della pipeline, quindi aggiungi un'altra fase della pipeline che estrae l'hour
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 } }
Questo risultato può quindi essere passato alla fase successiva della pipeline per estrarre solo l'hour
campo.
Ecco cosa succede se aggiungiamo un'altra proiezione solo per l'hour
campo:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
dateParts: { $dateToParts: { date: "$born" } }
}
},
{
$project:
{
birthHour: "$dateParts.hour"
}
}
]
)
Risultato:
{ "birthHour" : 23 } { "birthHour" : 4 } { "birthHour" : 10 }
Il punto qui è, se usi $dateToParts
nella tua pipeline, hai automaticamente accesso alla parte dell'ora (e a tutte le altre parti) nella fase successiva.
Vedi MongoDB $dateToParts
per ulteriori informazioni ed esempi.
Il forEach()
Metodo
Puoi usare cursor.forEach()
per scorrere il cursore, utilizzando un metodo JavaScript come getHours()
o getUTCHours()
per restituire solo il valore dell'ora.
db.cats.find().forEach(
function(c) {
print(
c.born.getUTCHours()
);
}
);
Risultato:
23 4 10
getUTCHours()
Il metodo JavaScript restituisce un numero intero, compreso tra 0 e 23, che rappresenta le ore nella data specificata in base all'ora universale.
Potresti anche notare che le opzioni precedenti restituiscono un intero documento che contiene una coppia nome/valore, mentre questa opzione restituisce solo il valore dell'ora 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.getHours();
return c;
}
);
Risultato:
[ 9, 14, 20 ]
Potresti aver notato che le ore risultanti sono diverse dagli esempi precedenti. Questo perché in questo esempio ho usato getHours()
Metodo JavaScript. Questo metodo restituisce il risultato in base all'ora locale. Avrei potuto usare altrettanto facilmente getUTCHours()
.