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

8 modi per ottenere il giorno da una data in MongoDB

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 }