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

5 modi per ottenere il mese da una data in MongoDB

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.