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

MongoDB $dateToString

In MongoDB, il $dateToString l'operatore della pipeline di aggregazione converte un determinato oggetto data in una stringa.

Il $dateToString l'operatore accetta una data, un timestamp o un ObjectId.

È possibile specificare un formato da utilizzare per il risultato fornendo una specifica del formato. La specifica del formato può essere qualsiasi stringa letterale, contenente 0 o più identificatori di formato.

La specifica del formato è facoltativa da MongoDB versione 4.0, quando featureCompatibilityVersion è impostato su 4.0 o più alto. Le versioni precedenti richiedono la specifica del formato.

Puoi opzionalmente utilizzare il timezone parametro per specificare il fuso orario da utilizzare.

Puoi anche usare onNull parametro per specificare cosa restituire se la data è null o mancante.

Esempio

Supponiamo di avere una collezione chiamata pets con il seguente documento:

{
	"_id" : ObjectId("600631c7c8eb4369cf6ad9c8"),
	"name" : "Fetch",
	"born" : ISODate("2020-12-31T23:30:15.123Z")
}

Possiamo eseguire il codice seguente per restituire una stringa di data da born campo in quel documento.

db.pets.aggregate(
   [
     {
       $project: {
         _id: 0,
          dateString: { $dateToString: { format: "%Y-%m-%dT%H:%M:%S.%LZ", date: "$born" } }
       }
     }
   ]
)

Risultato:

{ "dateString" : "2020-12-31T23:30:15.123Z" }

Questo esempio utilizza %Y-%m-%dT%H:%M:%S.%LZ come specifica del formato. Questa è la specifica di formato predefinita, ma in questo caso l'abbiamo specificata esplicitamente. Possiamo vedere che la stringa della data viene restituita utilizzando il formato specificato.

Qui, ho usato dateString come nome del campo da restituire, ma potrebbe essere qualsiasi cosa (come formattedDate , theDate eccetera).

Il _id il campo viene restituito per impostazione predefinita quando si utilizzano le proiezioni in MongoDB, ma in questo esempio ho nascosto esplicitamente _id campo utilizzando _id: 0 .

Vedi MongoDB $dateToString Specificatori di formato per un elenco di identificatori di formato disponibili.

Uscita predefinita

Come accennato, la specifica del formato nell'esempio precedente è la specifica del formato predefinita.

Se stai utilizzando MongoDB versione 4.0 o successiva, con featureCompatibilityVersion impostato su 4.0 o superiore (vedi come visualizzare la tua attuale featureCompatibilityVersion e come impostarlo), puoi omettere la specifica del formato se desideri formattare la data utilizzando il formato sopra.

Pertanto, potremmo riscrivere il precedente. esempio a questo:

db.pets.aggregate(
   [
     {
       $project: {
         _id: 0,
          dateString: { $dateToString: { date: "$born" } }
       }
     }
   ]
)

Risultato:

{ "dateString" : "2020-12-31T23:30:15.123Z" }

Specifica un fuso orario

Puoi specificare un fuso orario da utilizzare per l'output di $dateToString operatore.

Il fuso orario può essere specificato utilizzando l'identificatore del fuso orario Olson (ad es. "Europe/London" , "GMT" ) o l'offset UTC (ad es. "+02:30" , "-1030" ).

Identificatore di fuso orario Olson

Ecco un esempio che restituisce la stringa della data in tre diversi fusi orari, ciascuno dei quali utilizza gli ID fuso orario Olson:

db.pets.aggregate(
   [
     {
       $project: {
         _id: 0,
          UTC: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "UTC" } },
          Honolulu: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "Pacific/Honolulu" } },
          Auckland: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "Pacific/Auckland" } }
       }
     }
   ]
).pretty()

Risultato:

{
	"UTC" : "2020-12-31T23:30",
	"Honolulu" : "2020-12-31T13:30",
	"Auckland" : "2021-01-01T12:30"
}

Offset UTC

Ecco un esempio che utilizza l'offset UTC.

db.pets.aggregate(
   [
     {
       $project: {
         _id: 0,
          UTC: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "+00:00" } },
          Honolulu: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "-10:00" } },
          Auckland: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "+12:00" } }
       }
     }
   ]
).pretty()

Risultato:

{
	"UTC" : "2020-12-31T23:30",
	"Honolulu" : "2020-12-31T13:30",
	"Auckland" : "2021-01-01T11:30"
}

Formato della data della settimana ISO

Esistono alcuni identificatori di formato che consentono di generare la stringa della data utilizzando il formato ISO 8601.

In particolare, puoi utilizzare:

Specificatore di formato Uscita
%G Anno in formato ISO 8601
%u Numero del giorno della settimana in formato ISO 8601 (1-lunedì, 7-domenica)
%V Settimana dell'anno in formato ISO 8601

Supponiamo di avere una collezione chiamata cats con il seguente documento:

{
	"_id" : ObjectId("6008c9a5c8eb4369cf6ad9cc"),
	"name" : "Scratch",
	"born" : ISODate("2021-01-03T23:30:15.123Z")
}

Possiamo eseguire il codice seguente per estrarre i campi della data ISO da born campo in quel documento.

Ecco un esempio da dimostrare:

db.cats.aggregate(
   [
     {
       $project: {
         _id: 0,
          isoYear: { $dateToString: { format: "%G", date: "$born" } },
          isoDayOfWeek: { $dateToString: { format: "%u", date: "$born" } },
          isoWeekOfYear: { $dateToString: { format: "%V", date: "$born" } }
       }
     }
   ]
)

Risultato:

{ "isoYear" : "2020", "isoDayOfWeek" : "7", "isoWeekOfYear" : "53" }

Al contrario, di seguito è riportato lo stesso esempio, ma utilizzando le parti della data della settimana non ISO.

db.cats.aggregate(
   [
     {
       $project: {
         _id: 0,
          year: { $dateToString: { format: "%Y", date: "$born" } },
          dayofweek: { $dateToString: { format: "%w", date: "$born" } },
          weekofyear: { $dateToString: { format: "%U", date: "$born" } }
       }
     }
   ]
)

Risultato:

{ "year" : "2021", "dayofweek" : "1", "weekofyear" : "01" }

Possiamo vedere che il risultato è completamente diverso.

Il onNull Parametro

Il onNull il parametro può essere utilizzato per specificare cosa restituire se la data è nulla o non esiste.

Il valore fornito a onNull parametro può essere qualsiasi espressione valida.

Ecco un esempio:

db.pets.aggregate(
   [
     {
       $project: {
          _id: 0,
          dateString: { $dateToString: { date: null, onNull: "No date supplied" } }
       }
     }
   ]
)

Risultato:

{ "dateString" : "No date supplied" }

In questo caso, la data era null e quindi il documento di output include la stringa che ho fornito per onNull parametro.

Restituisci le parti della data da un ObjectId

Puoi usare $dateToString per restituire una stringa di data da un ObjectId.

I valori ObjectId sono valori esadecimali a 12 byte costituiti da:

  • Un valore di timestamp di 4 byte, che rappresenta la creazione dell'ObjectId, misurato in secondi dall'epoca di Unix.
  • Un 5 byte è un valore casuale
  • Un contatore incrementale di 3 byte, inizializzato su un valore casuale.

Per ricapitolare, il nostro primo documento si presenta così:

{
	"_id" : ObjectId("600631c7c8eb4369cf6ad9c8"),
	"name" : "Fetch",
	"born" : ISODate("2020-12-31T23:30:15.123Z")
}

Questo documento contiene un ObjectId. Possiamo quindi usare $dateToString per restituire una stringa di data, basata sulla data di creazione del nostro documento (o più precisamente, quando il _id è stato creato il valore ObjectId del campo).

Esempio:

db.pets.aggregate(
   [
     {
       $project: {
          timestamp: { $toDate: "$_id" },
          dateString: { $dateToString: { format: "%d-%m-%Y", date: "$_id" } }
       }
     }
   ]
).pretty()

Risultato:

{
	"_id" : ObjectId("600631c7c8eb4369cf6ad9c8"),
	"timestamp" : ISODate("2021-01-19T01:11:35Z"),
	"dateString" : "19-01-2021"
}

In questo caso, ho deciso di restituire solo la parte della data (non la parte dell'ora). Ho anche cambiato l'ordine dei giorni, dei mesi e dell'anno per dimostrare che puoi sicuramente farlo se necessario.

Ho anche usato $toDate operatore della pipeline di aggregazione per restituire la parte timestamp di ObjectId.