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

MongoDB $ dateFromParts

In MongoDB, il $dateFromParts l'operatore della pipeline di aggregazione costruisce e restituisce un oggetto Date dalle parti costitutive della data.

Fornisci ogni parte della data come un campo separato.

Se necessario, puoi specificare i campi della data costituente nel formato della data della settimana ISO.

Esempio

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

{
	"_id" : 1,
	"year" : 2020,
	"month" : 12,
	"day" : 31,
	"hour" : 23,
	"minute" : 30,
	"second" : 25,
	"millisecond" : 123
}

Il documento contiene un campo diverso per ogni parte della data.

Possiamo eseguire il codice seguente per restituire un oggetto data dai campi in quei documenti.

db.dateParts.aggregate([
{
   $project: {
      date: {
         $dateFromParts: {
            "year": "$year", 
            "month": "$month", 
            "day": "$day", 
            "hour": "$hour", 
            "minute": "$minute", 
            "second": "$second", 
            "millisecond": "$millisecond"
         }
      }
   }
}])

Risultato:

{ "_id" : 1, "date" : ISODate("2020-12-31T23:30:25.123Z") }

Tutte le parti di data/ora sono state convertite in un unico oggetto data.

Fusi orari

Puoi utilizzare il timezone campo per specificare un fuso orario.

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 utilizza gli ID di fuso orario Olson per generare tre date diverse da un unico documento, in base a tre diversi fusi orari.

db.dateParts.aggregate([
{
   $project: {
      dateUTC: {
         $dateFromParts: {
            "year": "$year", 
            "month": "$month", 
            "day": "$day", 
            "hour": "$hour", 
            "minute": "$minute", 
            "second": "$second", 
            "millisecond": "$millisecond",
            "timezone": "Pacific/Auckland"
         }
      },
      dateHonolulu: {
         $dateFromParts: {
            "year": "$year", 
            "month": "$month", 
            "day": "$day", 
            "hour": "$hour", 
            "minute": "$minute", 
            "second": "$second", 
            "millisecond": "$millisecond",
            "timezone": "Pacific/Honolulu"
         }
      },
      dateAuckland: {
         $dateFromParts: {
            "year": "$year", 
            "month": "$month", 
            "day": "$day", 
            "hour": "$hour", 
            "minute": "$minute", 
            "second": "$second", 
            "millisecond": "$millisecond",
            "timezone": "Pacific/Auckland"
         }
      }
   }
}]).pretty()

Risultato:

{
	"_id" : 1,
	"dateUTC" : ISODate("2020-12-31T10:30:25.123Z"),
	"dateHonolulu" : ISODate("2021-01-01T09:30:25.123Z"),
	"dateAuckland" : ISODate("2020-12-31T10:30:25.123Z")
}

Offset UTC

Ecco un esempio che utilizza l'offset UTC.

db.dateParts.aggregate([
{
   $project: {
      "date+00:00": {
         $dateFromParts: {
            "year": "$year", 
            "month": "$month", 
            "day": "$day", 
            "hour": "$hour", 
            "minute": "$minute", 
            "second": "$second", 
            "millisecond": "$millisecond",
            "timezone": "+00:00"
         }
      },
      "date-10:00": {
         $dateFromParts: {
            "year": "$year", 
            "month": "$month", 
            "day": "$day", 
            "hour": "$hour", 
            "minute": "$minute", 
            "second": "$second", 
            "millisecond": "$millisecond",
            "timezone": "-10:00"
         }
      },
      "date+12:00": {
         $dateFromParts: {
            "year": "$year", 
            "month": "$month", 
            "day": "$day", 
            "hour": "$hour", 
            "minute": "$minute", 
            "second": "$second", 
            "millisecond": "$millisecond",
            "timezone": "+12:00"
         }
      }
   }
}]).pretty()

Risultato:

{
	"_id" : 1,
	"date+00:00" : ISODate("2020-12-31T23:30:25.123Z"),
	"date-10:00" : ISODate("2021-01-01T09:30:25.123Z"),
	"date+12:00" : ISODate("2020-12-31T11:30:25.123Z")
}

Formato della data della settimana ISO

Le parti della data possono essere specificate utilizzando il formato ISO 8601, se necessario.

In particolare, puoi utilizzare:

Specificatore di formato Uscita
isoWeekYear Anno nel formato ISO 8601. Questo campo è obbligatorio se non si utilizza year (e year è richiesto se non si utilizza isoWeekYear ).
isoWeek Settimana dell'anno in formato ISO 8601. Può essere utilizzato solo con isoWeekYear .
isoDayOfWeek Giorno della settimana (1-lunedì, 7-domenica). Può essere utilizzato solo con isoWeekYear .

Supponiamo di inserire un secondo documento simile al seguente:

{
	"_id" : 2,
	"isoWeekYear" : 2021,
	"isoWeek" : 32,
	"isoDayOfWeek" : 7,
	"hour" : 23,
	"minute" : 30,
	"second" : 25,
	"millisecond" : 123,
	"timezone" : "UTC"
}

Possiamo vedere che utilizza isoWeekYear , isoWeek e isoDayOfWeek invece di year , month e day (che è ciò che usa il primo documento).

Possiamo usare il codice seguente per costruire un oggetto Date da questo documento:

db.dateParts.aggregate([
  { $match: { _id: 2} },
  {
    $project: {
        date: {
          $dateFromParts: {
              "isoWeekYear": "$isoWeekYear", 
              "isoWeek": "$isoWeek", 
              "isoDayOfWeek": "$isoDayOfWeek", 
              "hour": "$hour", 
              "minute": "$minute", 
              "second": "$second", 
              "millisecond": "$millisecond", 
              "timezone": "$timezone"
          }
        }
    }
  }
])

Risultato:

{ "_id" : 2, "date" : ISODate("2021-08-15T23:30:25.123Z") } 

Campi fuori portata

A partire da MongoDB 4.4, l'intervallo di valori supportato per year e isoWeekYear è 1-9999 . Nelle versioni precedenti, il limite inferiore per questi valori era 0 e l'intervallo di valori supportato era 0-9999 .

A partire da MongoDB 4.0, se il valore specificato per campi diversi da year , isoWeekYear e timezone è al di fuori dell'intervallo valido, il $dateFromParts l'operatore trasporta o sottrae la differenza dalle altre parti della data per calcolare la data.

Valori superiori all'intervallo

Supponiamo di aggiungere il seguente documento alla nostra raccolta:

{
	"_id" : 3,
	"year" : 2020,
	"month" : 14,
	"day" : 65,
	"hour" : 48,
	"minute" : 130,
	"second" : 625,
	"millisecond" : 123
}

Molti dei campi di data e ora in questo documento sono superiori ai rispettivi intervalli validi.

Eseguiamo il seguente comando per convertirlo in un oggetto Date:

db.dateParts.aggregate([
  { $match: { _id: 3} },
  {
    $project: {
        date: {
          $dateFromParts: {
              "year": "$year", 
              "month": "$month", 
              "day": "$day", 
              "hour": "$hour", 
              "minute": "$minute", 
              "second": "$second", 
              "millisecond": "$millisecond"
          }
        }
    }
  }
])

Risultato:

{ "_id" : 3, "date" : ISODate("2021-04-08T02:20:25.123Z") }

Possiamo vedere che le parti della data nell'oggetto Date risultante sono diverse dalle rispettive parti della data nel documento. Questo perché $dateFromParts ha ricalcolato la data per tenere conto dei valori della parte della data che hanno superato il loro intervallo normale.

Valori inferiori all'intervallo

Supponiamo di aggiungere il seguente documento alla nostra raccolta:

{
	"_id" : 4,
	"year" : 2020,
	"month" : 0,
	"day" : 0,
	"hour" : 0,
	"minute" : 0,
	"second" : 0,
	"millisecond" : 0
}

Molti dei campi di data e ora in questo documento sono inferiori ai rispettivi intervalli validi.

Eseguiamo il seguente comando per convertirlo in un oggetto Date:

db.dateParts.aggregate([
  { $match: { _id: 4} },
  {
    $project: {
        date: {
          $dateFromParts: {
              "year": "$year", 
              "month": "$month", 
              "day": "$day", 
              "hour": "$hour", 
              "minute": "$minute", 
              "second": "$second", 
              "millisecond": "$millisecond"
          }
        }
    }
  }
])

Risultato:

{ "_id" : 4, "date" : ISODate("2019-11-30T00:00:00Z") }