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

MongoDB $ dateToParts

In MongoDB, il $dateToParts l'operatore della pipeline di aggregazione restituisce le parti della data di una determinata data.

Più specificamente, restituisce un documento che contiene le parti costitutive di un dato valore BSON Date come singole proprietà.

Le parti della data restituite da $dateToParts sono year , month , day , hour , minute , second e millisecond .

Quando si utilizza $dateToParts operatore, puoi facoltativamente specificare un fuso orario da utilizzare per il risultato.

Il $dateToParts operatore accetta una data (come una data, un timestamp o un ObjectId) o un documento che specifica la data e il fuso orario da utilizzare.

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 le varie parti della data dal born campo in quel documento.

db.pets.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          dateParts: { $dateToParts: { date: "$born" } }
        }
    }
  ]
).pretty()

Risultato:

{
	"dateParts" : {
		"year" : 2020,
		"month" : 12,
		"day" : 31,
		"hour" : 23,
		"minute" : 30,
		"second" : 15,
		"millisecond" : 123
	}
}

Possiamo vedere che ogni parte della data viene restituita nel proprio campo.

Qui, ho usato dateParts come nome del campo da restituire, ma potrebbe essere qualsiasi cosa (come 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 .

Specifica un fuso orario

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

Quando lo fai, l'argomento è passato a $dateToParts deve essere della seguente forma:

{ date: <dateExpression>, timezone: <tzExpression> }

Dove <dateExpression> è la data da utilizzare e <tzExpression> è il fuso orario da utilizzare.

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 le parti della data in due fusi orari diversi, ciascuno dei quali utilizza gli ID fuso orario Olson:

db.pets.aggregate(
  [
    {
      $project: {
          _id: 0,
          honolulu: { 
            $dateToParts: { date: "$born", timezone: "Pacific/Honolulu" }
            },
          auckland: { 
            $dateToParts: { date: "$born", timezone: "Pacific/Auckland" }
            }
        }
    }
  ]
).pretty()

Risultato:

{
	"honolulu" : {
		"year" : 2020,
		"month" : 12,
		"day" : 31,
		"hour" : 13,
		"minute" : 30,
		"second" : 15,
		"millisecond" : 123
	},
	"auckland" : {
		"year" : 2021,
		"month" : 1,
		"day" : 1,
		"hour" : 12,
		"minute" : 30,
		"second" : 15,
		"millisecond" : 123
	}
}

In questo caso, la data avanza all'anno/mese/settimana/giorno/ora successivo quando si utilizza il Pacific/Auckland fuso orario.

Offset UTC

Ecco lo stesso esempio, tranne che questa volta usiamo l'offset UTC.

db.pets.aggregate(
  [
    {
      $project: {
          _id: 0,
          "utcOffset-1000": { 
            $dateToParts: { date: "$born", timezone: "-1000" }
            },
          "utcOffset+1200": { 
            $dateToParts: { date: "$born", timezone: "+1200" }
            }
        }
    }
  ]
).pretty()

Risultato:

{
	"utcOffset-1000" : {
		"year" : 2020,
		"month" : 12,
		"day" : 31,
		"hour" : 13,
		"minute" : 30,
		"second" : 15,
		"millisecond" : 123
	},
	"utcOffset+1200" : {
		"year" : 2021,
		"month" : 1,
		"day" : 1,
		"hour" : 11,
		"minute" : 30,
		"second" : 15,
		"millisecond" : 123
	}
}

Parti della data della settimana ISO

Puoi usare iso8601: true per modificare il documento di output per utilizzare i campi della data della settimana ISO. Questo basa la data sullo standard 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.pets.aggregate(
  [
    {
      $project: {
          _id: 0,
          dateParts: { 
            $dateToParts: { 
              date: "$born"
            }
          },
          datePartsISO: { 
            $dateToParts: { 
              date: "$born",
              iso8601: true
            }
          }
      }
    }
  ]
).pretty()

Risultato:

{
	"dateParts" : {
		"year" : 2020,
		"month" : 12,
		"day" : 31,
		"hour" : 23,
		"minute" : 30,
		"second" : 15,
		"millisecond" : 123
	},
	"datePartsISO" : {
		"isoWeekYear" : 2020,
		"isoWeek" : 53,
		"isoDayOfWeek" : 4,
		"hour" : 23,
		"minute" : 30,
		"second" : 15,
		"millisecond" : 123
	}
}

Il primo documento di output utilizza il normale output di data. Il secondo documento utilizza i campi e i valori della data della settimana ISO.

Restituisci le parti della data da un ObjectId

Puoi usare $dateToParts per restituire le parti della 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 documento si presenta così:

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

Questo documento contiene un ObjectId. Possiamo quindi utilizzare $dateToParts restituire le parti di data, in base alla data di creazione del nostro documento (o più specificamente, quando il _id è stato creato il valore ObjectId del campo).

Esempio:

db.pets.aggregate(
  [
    {
      $project:
        {
          "timeStamp": { $toDate: "$_id"},
          "dateParts": { $dateToParts: { date: "$_id" } }
        }
    }
  ]
).pretty()

Risultato:

{
	"_id" : ObjectId("600631c7c8eb4369cf6ad9c8"),
	"timeStamp" : ISODate("2021-01-19T01:11:35Z"),
	"dateParts" : {
		"year" : 2021,
		"month" : 1,
		"day" : 19,
		"hour" : 1,
		"minute" : 11,
		"second" : 35,
		"millisecond" : 0
	}
}

In questo caso, ho utilizzato anche $toDate operatore della pipeline di aggregazione per restituire la parte timestamp di ObjectId.