MongoDB fornisce una serie di operatori di pipeline di aggregazione per lavorare con le date, inclusi 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. È 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 del mese 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 mese dal born
campo di quei documenti.
Il $month
Operatore
Il $month
l'operatore è progettato specificamente per restituire un documento con la parte del mese di una determinata data.
Possiamo eseguire il codice seguente per restituire il mese da born
campo nel documento sopra.
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthMonth: { $month: "$born" }
}
}
]
)
Risultato:
{ "birthMonth" : 1 } { "birthMonth" : 12 } { "birthMonth" : 9 }
Puoi anche specificare il fuso orario quando usi il $month
operatore.
Vedi MongoDB $month
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 del mese, se richiesto.
Sono disponibili identificatori di formato per ciascuna parte della data. Il %m
l'identificatore di formato restituisce il mese.
Esempio:
db.cats.aggregate(
[
{
$project: {
_id: 0,
birthMonth: { $dateToString: { format: "%m", date: "$born" } }
}
}
]
)
Risultato:
{ "birthMonth" : "01" } { "birthMonth" : "12" } { "birthMonth" : "09" }
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 del mese, 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 il month
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 il month
campo.
Ecco cosa succede se aggiungiamo un'altra proiezione solo per il month
campo:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
dateParts: { $dateToParts: { date: "$born" } }
}
},
{
$project:
{
birthMonth: "$dateParts.month"
}
}
]
)
Risultato:
{ "birthMonth" : 1 } { "birthMonth" : 12 } { "birthMonth" : 9 }
Questo ovviamente non è così conciso come usare le opzioni precedenti. Tuttavia, a seconda di ciò che stai facendo nella tua pipeline, questo approccio potrebbe adattarsi al conto.
Vedi MongoDB $dateToParts
per ulteriori informazioni ed esempi.
Il forEach()
Metodo
Puoi usare cursor.forEach()
per scorrere il cursore, utilizzando un metodo JavaScript come getMonth()
o getUTCMonth()
per restituire solo il valore del mese.
db.cats.find().forEach(
function(c) {
print(
c.born.getMonth()
);
}
);
Risultato:
0 11 8
Nota che getMonth()
Il metodo JavaScript restituisce il numero del mese come numero intero, compreso tra 0 e 11.
Potresti anche notare che le opzioni precedenti restituiscono un intero documento che contiene una coppia nome/valore, mentre questa opzione restituisce solo il valore del mese 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.getMonth();
return c;
}
);
Risultato:
[ 0, 11, 8 ]
Di nuovo, otteniamo i mesi come numeri interi compresi tra 0 e 11.