In MongoDB, de $dateFromParts
aggregatiepijplijnoperator construeert en retourneert een Date-object uit de samenstellende delen van de datum.
U geeft elk datumgedeelte op als een apart veld.
Indien nodig kunt u uw samenstellende datumvelden specificeren in ISO-weekdatumformaat.
Voorbeeld
Stel dat we een verzameling hebben met de naam dateParts
met het volgende document:
{ "_id" : 1, "year" : 2020, "month" : 12, "day" : 31, "hour" : 23, "minute" : 30, "second" : 25, "millisecond" : 123 }
Het document bevat voor elk datumgedeelte een ander veld.
We kunnen de volgende code uitvoeren om een datumobject uit de velden in die documenten te retourneren.
db.dateParts.aggregate([
{
$project: {
date: {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond"
}
}
}
}])
Resultaat:
{ "_id" : 1, "date" : ISODate("2020-12-31T23:30:25.123Z") }
Alle datum-/tijddelen zijn geconverteerd naar een enkel datumobject.
Tijdzones
U kunt de timezone
. gebruiken veld om een tijdzone op te geven.
De tijdzone kan worden opgegeven met behulp van de Olson-tijdzone-ID (bijv. "Europe/London"
, "GMT"
) of de UTC-offset (bijv. "+02:30"
, "-1030"
).
Olson tijdzone-ID
Hier is een voorbeeld dat Olson-tijdzone-ID's gebruikt om drie verschillende datums uit een enkel document uit te voeren, gebaseerd op drie verschillende tijdzones.
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()
Resultaat:
{ "_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") }
UTC-offset
Hier is een voorbeeld dat de UTC-offset gebruikt.
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()
Resultaat:
{ "_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") }
ISO-weekdatumnotatie
De datumdelen kunnen indien nodig worden gespecificeerd met behulp van het ISO 8601-formaat.
U kunt in het bijzonder gebruik maken van:
Formaatspecificatie | Uitvoer |
---|---|
isoWeekYear | Jaar in ISO 8601-formaat. Dit veld is verplicht als year niet wordt gebruikt (en year is vereist als isoWeekYear . niet wordt gebruikt ). |
isoWeek | Week van het jaar in ISO 8601-formaat. Kan alleen worden gebruikt met isoWeekYear . |
isoDayOfWeek | Dag van de week (1-maandag, 7-zondag). Kan alleen worden gebruikt met isoWeekYear . |
Stel dat we een tweede document invoegen dat er als volgt uitziet:
{ "_id" : 2, "isoWeekYear" : 2021, "isoWeek" : 32, "isoDayOfWeek" : 7, "hour" : 23, "minute" : 30, "second" : 25, "millisecond" : 123, "timezone" : "UTC" }
We kunnen zien dat het isoWeekYear
. gebruikt , isoWeek
, en isoDayOfWeek
in plaats van year
, month
, en day
(wat het eerste document gebruikt).
We kunnen de volgende code gebruiken om een Date-object uit dit document te construeren:
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"
}
}
}
}
])
Resultaat:
{ "_id" : 2, "date" : ISODate("2021-08-15T23:30:25.123Z") }
Buiten bereik velden
Vanaf MongoDB 4.4, het ondersteunde waardebereik voor year
en isoWeekYear
is 1-9999
. In eerdere versies was de ondergrens voor deze waarden 0
en het ondersteunde waardebereik was 0-9999
.
Vanaf MongoDB 4.0, als de waarde gespecificeerd voor andere velden dan year
, isoWeekYear
, en timezone
buiten het geldige bereik valt, de $dateFromParts
operator draagt het verschil bij of trekt het af van andere datumdelen om de datum te berekenen.
Waarden hoger dan het bereik
Stel dat we het volgende document aan onze collectie toevoegen:
{ "_id" : 3, "year" : 2020, "month" : 14, "day" : 65, "hour" : 48, "minute" : 130, "second" : 625, "millisecond" : 123 }
Veel van de datum- en tijdvelden in dit document zijn hoger dan hun respectievelijke geldige bereiken.
Laten we de volgende opdracht uitvoeren om het om te zetten in een Date-object:
db.dateParts.aggregate([
{ $match: { _id: 3} },
{
$project: {
date: {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond"
}
}
}
}
])
Resultaat:
{ "_id" : 3, "date" : ISODate("2021-04-08T02:20:25.123Z") }
We kunnen zien dat de datumdelen in het resulterende Date-object verschillen van hun respectievelijke datumdelen in het document. Dit komt omdat $dateFromParts
herberekend de datum om rekening te houden met de datumdeelwaarden die hun normale bereik overschreden.
Waarden lager dan het bereik
Stel dat we het volgende document aan onze collectie toevoegen:
{ "_id" : 4, "year" : 2020, "month" : 0, "day" : 0, "hour" : 0, "minute" : 0, "second" : 0, "millisecond" : 0 }
Veel van de datum- en tijdvelden in dit document zijn lager dan hun respectievelijke geldige bereiken.
Laten we de volgende opdracht uitvoeren om het om te zetten in een Date-object:
db.dateParts.aggregate([
{ $match: { _id: 4} },
{
$project: {
date: {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond"
}
}
}
}
])
Resultaat:
{ "_id" : 4, "date" : ISODate("2019-11-30T00:00:00Z") }