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") }