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

5 modi per ottenere l'ora da una data in MongoDB

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() .