MongoDBでは、$dateFromParts
集計パイプライン演算子は、日付の構成要素からDateオブジェクトを作成して返します。
各日付部分を個別のフィールドとして指定します。
必要に応じて、構成日付フィールドをISO週の日付形式で指定できます。
例
dateParts
というコレクションがあるとします。 次のドキュメントで:
{ "_id" : 1, "year" : 2020, "month" : 12, "day" : 31, "hour" : 23, "minute" : 30, "second" : 25, "millisecond" : 123 }
ドキュメントには、日付部分ごとに異なるフィールドが含まれています。
次のコードを実行して、これらのドキュメントのフィールドから日付オブジェクトを返すことができます。
db.dateParts.aggregate([
{
$project: {
date: {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond"
}
}
}
}])
結果:
{ "_id" : 1, "date" : ISODate("2020-12-31T23:30:25.123Z") }
すべての日付/時刻部分が単一の日付オブジェクトに変換されました。
タイムゾーン
timezone
を使用できます タイムゾーンを指定するフィールド。
タイムゾーンは、Olsonタイムゾーン識別子(例:"Europe/London"
)を使用して指定できます。 、"GMT"
)またはUTCオフセット(例:"+02:30"
、"-1030"
。
オルソンタイムゾーン識別子
これは、OlsonタイムゾーンIDを使用して、3つの異なるタイムゾーンに基づいて1つのドキュメントから3つの異なる日付を出力する例です。
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()
結果:
{ "_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オフセット
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()
結果:
{ "_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週の日付形式
日付部分は、必要に応じてISO8601形式を使用して指定できます。
特に、次を使用できます:
フォーマット指定子 | 出力 |
---|---|
isoWeekYear | ISO8601形式の年。 year を使用しない場合、このフィールドは必須です (およびyear isoWeekYear を使用しない場合は必須です )。 |
isoWeek | ISO8601形式の年の週。 isoWeekYear でのみ使用できます 。 |
isoDayOfWeek | 曜日(1-月曜日、7-日曜日)。 isoWeekYear でのみ使用できます 。 |
次のような2番目のドキュメントを挿入するとします。
{ "_id" : 2, "isoWeekYear" : 2021, "isoWeek" : 32, "isoDayOfWeek" : 7, "hour" : 23, "minute" : 30, "second" : 25, "millisecond" : 123, "timezone" : "UTC" }
isoWeekYear
を使用していることがわかります 、isoWeek
、およびisoDayOfWeek
year
の代わりに 、month
、およびday
(これが最初のドキュメントで使用されているものです。)
次のコードを使用して、このドキュメントからDateオブジェクトを作成できます。
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"
}
}
}
}
])
結果:
{ "_id" : 2, "date" : ISODate("2021-08-15T23:30:25.123Z") }
範囲外のフィールド
MongoDB 4.4以降、year
でサポートされる値の範囲 およびisoWeekYear
は1-9999
。以前のバージョンでは、これらの値の下限は0
でした。 サポートされている値の範囲は0-9999
でした 。
MongoDB 4.0以降、year
以外のフィールドに値が指定されている場合 、isoWeekYear
、およびtimezone
有効な範囲外の$dateFromParts
演算子は、日付を計算するために、他の日付部分との差を計算するか減算します。
範囲よりも高い値
コレクションに次のドキュメントを追加するとします。
{ "_id" : 3, "year" : 2020, "month" : 14, "day" : 65, "hour" : 48, "minute" : 130, "second" : 625, "millisecond" : 123 }
このドキュメントの日付と時刻のフィールドの多くは、それぞれの有効な範囲よりも高くなっています。
次のコマンドを実行して、Dateオブジェクトに変換してみましょう。
db.dateParts.aggregate([
{ $match: { _id: 3} },
{
$project: {
date: {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond"
}
}
}
}
])
結果:
{ "_id" : 3, "date" : ISODate("2021-04-08T02:20:25.123Z") }
結果のDateオブジェクトの日付部分が、ドキュメント内のそれぞれの日付部分とは異なることがわかります。これは、$dateFromParts
が原因です 通常の範囲を超えた日付部分の値を考慮して、日付を再計算しました。
範囲より低い値
コレクションに次のドキュメントを追加するとします。
{ "_id" : 4, "year" : 2020, "month" : 0, "day" : 0, "hour" : 0, "minute" : 0, "second" : 0, "millisecond" : 0 }
このドキュメントの日付と時刻のフィールドの多くは、それぞれの有効な範囲よりも低くなっています。
次のコマンドを実行して、Dateオブジェクトに変換してみましょう。
db.dateParts.aggregate([
{ $match: { _id: 4} },
{
$project: {
date: {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond"
}
}
}
}
])
結果:
{ "_id" : 4, "date" : ISODate("2019-11-30T00:00:00Z") }