Quando si estrae il giorno da una data, l'esatta opzione che utilizziamo dipenderà da come vogliamo che venga rappresentato il giorno.
Ad esempio, vogliamo il giorno della settimana, il giorno del mese o il giorno dell'anno? O forse lo vogliamo nel formato ISO 8601? Il valore di ritorno sarà generalmente diverso a seconda di quale scegliamo.
Questo articolo esplora queste opzioni e quindi presenta 8 modi per restituire la parte del giorno 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 del giorno dal born
campo di quei documenti.
Il $dayOfWeek
Operatore
Come suggerisce il nome, il $dayOfWeek
l'operatore restituisce il giorno della settimana da una data.
Possiamo eseguire il codice seguente per restituire il giorno della settimana dal born
campo nel documento sopra.
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthDayOfWeek: { $dayOfWeek: "$born" }
}
}
]
)
Risultato:
{ "birthDayOfWeek" : 1 } { "birthDayOfWeek" : 1 } { "birthDayOfWeek" : 5 }
È anche possibile specificare il fuso orario quando si utilizza il $dayOfWeek
operatore.
Vedi MongoDB $dayOfWeek
per ulteriori informazioni ed esempi.
Il $dayOfMonth
Operatore
Il $dayOfMonth
l'operatore restituisce il giorno del mese da una data.
Esempio:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthDayOfMonth: { $dayOfMonth: "$born" }
}
}
]
)
Risultato:
{ "birthDayOfMonth" : 3 } { "birthDayOfMonth" : 8 } { "birthDayOfMonth" : 24 }
Puoi anche specificare il fuso orario quando usi il $dayOfMonth
operatore.
Vedi MongoDB $dayOfMonth
per ulteriori informazioni ed esempi.
Il $dayOfYear
Operatore
Sì, hai indovinato. Il $dayOfYear
l'operatore restituisce il giorno dell'anno da una data.
Esempio:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthDayOfYear: { $dayOfYear: "$born" }
}
}
]
)
Risultato:
{ "birthDayOfYear" : 3 } { "birthDayOfYear" : 342 } { "birthDayOfYear" : 268 }
Il $dayOfYear
l'operatore accetta anche un parametro del fuso orario.
Vedi MongoDB $dayOfYear
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 parte del giorno.
Esistono identificatori di formato per ciascuna parte della data e, quando si tratta della parte relativa al giorno, è possibile scegliere gli identificatori di formato che dipenderanno dal fatto che si desideri restituire il giorno della settimana, il giorno del mese, il giorno dell'anno o il giorno della settimana in formato ISO 8601.
Esempio:
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()
Risultato:
{ "birthDayOfWeek" : "1", "birthDayOfMonth" : "03", "birthDayOfYear" : "003", "birthDayOfWeekISO" : "7" } { "birthDayOfWeek" : "1", "birthDayOfMonth" : "08", "birthDayOfYear" : "342", "birthDayOfWeekISO" : "7" } { "birthDayOfWeek" : "5", "birthDayOfMonth" : "24", "birthDayOfYear" : "268", "birthDayOfWeekISO" : "4" }
Avremmo potuto fornire più specificatori di formato per includere altre parti della data nel risultato, ma poiché in questo articolo siamo interessati solo all'estrazione del giorno, abbiamo utilizzato gli specificatori di formato solo per restituire la parte del giorno.
Vedi MongoDB $dateToString
per ulteriori informazioni ed esempi.
Vedi anche MongoDB $dateToString
Specificatori di formato per un elenco di identificatori di formato che puoi utilizzare con $dateToString
.
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
.
Possiamo quindi utilizzare $dateToParts
in una fase della pipeline, quindi aggiungi un'altra fase della pipeline che estrae il day
parte se richiesta.
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 il day
campo.
Ecco cosa succede se aggiungiamo un'altra proiezione solo per il day
campo:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
dateParts: { $dateToParts: { date: "$born" } }
}
},
{
$project:
{
birthDay: "$dateParts.day"
}
}
]
)
Risultato:
{ "birthDay" : 3 } { "birthDay" : 8 } { "birthDay" : 24 }
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.
Vale anche la pena ricordare che $dateToParts
accetta 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 per restituire solo il valore del giorno.
db.cats.find().forEach(
function(c) {
print(
c.born.getDay()
);
}
);
Risultato:
1 0 4
In questo caso, utilizziamo JavaScript getDay()
metodo, che restituisce un numero intero, compreso tra 0 e 6, corrispondente al giorno della settimana per la data specificata, in base all'ora locale.
Un'altra opzione è usare getUTCDay()
metodo, che utilizza il tempo universale. Useremo questo metodo nel prossimo esempio.
In alternativa, avremmo potuto utilizzare JavaScript getDate()
metodo, che restituisce un numero intero, compreso tra 1 e 31, che rappresenta il giorno del mese per la data specificata.
Inoltre, questa opzione restituisce solo il valore del giorno effettivo e non l'intero documento, come negli esempi precedenti.
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.getUTCDay();
return c;
}
);
Risultato:
[ 0, 0, 4 ]
Come accennato, JavaScript getUTCDay()
il metodo restituisce il risultato utilizzando il tempo universale. In questo caso, è stato restituito un valore diverso per il primo documento (abbiamo ottenuto 0
in questo esempio, rispetto a 1
nella precedente).
Il $isoDayOfWeek
Operatore
Se devi restituire il giorno della settimana nel formato ISO 8601, puoi utilizzare $isoDayOfWeek
. 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,
birthIsoDayOfWeek: { $isoDayOfWeek: "$born" }
}
}
]
)
Risultato:
{ "birthIsoDayOfWeek" : 7 } { "birthIsoDayOfWeek" : 7 } { "birthIsoDayOfWeek" : 4 }
In questo caso otteniamo un risultato completamente diverso da quello che abbiamo ottenuto usando il $dayOfWeek
operatore, a causa del modo in cui ISO 8601 calcola le date.
Ecco un esempio che dimostra questa differenza:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthDayOfWeek: { $dayOfWeek: "$born" },
birthIsoDayOfWeek: { $isoDayOfWeek: "$born" }
}
}
]
)
Risultato:
{ "birthDayOfWeek" : 1, "birthIsoDayOfWeek" : 7 } { "birthDayOfWeek" : 1, "birthIsoDayOfWeek" : 7 } { "birthDayOfWeek" : 5, "birthIsoDayOfWeek" : 4 }