定義
$dateFromParts日付の構成プロパティを指定して Date オブジェクトを構築し返します。
$dateFromParts式の構文は次のとおりです。{ $dateFromParts : { 'year': <year>, 'month': <month>, 'day': <day>, 'hour': <hour>, 'minute': <minute>, 'second': <second>, 'millisecond': <ms>, 'timezone': <tzExpression> } } 次の構文を使用して、ISO 週日 形式で構成日付フィールドを指定することもできます。
{ $dateFromParts : { 'isoWeekYear': <year>, 'isoWeek': <week>, 'isoDayOfWeek': <day>, 'hour': <hour>, 'minute': <minute>, 'second': <second>, 'millisecond': <ms>, 'timezone': <tzExpression> } } $dateFromPartsは、次のフィールドを持つドキュメントを取得します。重要
$dateFromParts入力ドキュメントを作成するときに、暦上の日付と ISO 週の日付フィールドを組み合わせて使用することはできません。フィールド必須/オプション説明yearを使用していない場合は必須
isoWeekYearisoWeekYearを使用していない場合は必須
yearISO 週日付年。 数値に評価される任意の式を指定できます。
値の範囲:
指定された数値がこの範囲を超えると、1-9999$dateFromPartsはエラーになります。この値の下限は1です。month任意。
yearとのみ使用できます。月。 数値に評価される任意の式を指定できます。
デフォルトは
1です。値の範囲:
指定された数値がこの範囲外の場合、1-12$dateFromPartsは日付の計算に差を組み込みます。例については、「 値の範囲 」を参照してください。isoWeek任意。
isoWeekYearとのみ使用できます。年内の週。 数値に評価される任意の式を指定できます。
デフォルトは
1です。値の範囲:
指定された数値がこの範囲外の場合、1-53$dateFromPartsは日付の計算に差を組み込みます。例については、「 値の範囲 」を参照してください。day任意。
yearとのみ使用できます。日付。 数値に評価される任意の式を指定できます。
デフォルトは
1です。値の範囲:
指定された数値がこの範囲外の場合、1-31$dateFromPartsは日付の計算に差を組み込みます。例については、「 値の範囲 」を参照してください。isoDayOfWeek任意。
isoWeekYearとのみ使用できます。曜日( 月曜日
1- 日曜日7)。 数値に評価される任意の式を指定できます。デフォルトは
1です。値の範囲:
指定された数値がこの範囲外の場合、1-7$dateFromPartsは日付の計算に差を組み込みます。例については、「 値の範囲 」を参照してください。hour任意
時間。 数値に評価される任意の式を指定できます。
デフォルトは
0です。値の範囲:
指定された数値がこの範囲外の場合、0-23$dateFromPartsは日付の計算に差を組み込みます。例については、「 値の範囲 」を参照してください。minute任意
分。 数値に評価される任意の式を指定できます。
デフォルトは
0です。値の範囲:
0-59指定された数値がこの範囲外の場合、$dateFromPartsは日付の計算にその差を組み込みます。例については、「 値の範囲 」を参照してください。second任意
2 つ。 数値に評価される任意の式を指定できます。
デフォルトは
0です。値の範囲:
指定された数値がこの範囲外の場合、0-59$dateFromPartsは日付の計算に差を組み込みます。例については、「 値の範囲 」を参照してください。millisecond任意
ミリ秒。 数値に評価される任意の式を指定できます。
デフォルトは
0です。値の範囲:
指定された数値がこの範囲外の場合、0-999$dateFromPartsは日付の計算に差を組み込みます。例については、「 値の範囲 」を参照してください。timezone任意
<timezone>は、値が次のいずれかの として評価される任意の 式string にすることができます。Olson タイムゾーン識別子(
"Europe/London"や"America/New_York"など)、または次の形式の UTC オフセット:
+/-[hh]:[mm]、例:"+04:45"、または+/-[hh][mm]、例:"-0530"、または+/-[hh], e.g."+03".
式の詳細については、「式 」を参照してください。
動作
値の範囲
yearとisoWeekYearでサポートされている値の範囲は1-9999です。
year 、 isoWeekYear 、 timezone以外のフィールドに指定された値が有効範囲外の場合、 $dateFromPartsは他の日付部分との差を保持または減算して日付を計算します。
値が範囲より大きい
次の$dateFromParts式を考えてみましょう。 monthフィールド値は14で、これは12か月(または1年)の最大値よりも2か月大きいです。
{ $dateFromParts: { 'year' : 2017, 'month' : 14, 'day': 1, 'hour' : 12 } }
式では、 yearを 1 増やし、 monthを 2 に設定して日付を計算し、以下を返します。
ISODate("2018-02-01T12:00:00Z")
値が範囲より小さい
次の$dateFromParts 式を考慮します。ここで、month フィールド値は0 であり、これは1 月の最小値よりも1 か月です。
{ $dateFromParts: { 'year' : 2017, 'month' : 0, 'day': 1, 'hour' : 12 } }
式では、 yearを 1 減らし、 monthを 12 に設定して日付を計算すると次のように結果が返されます。
ISODate("2016-12-01T12:00:00Z")
タイムゾーン
<timezone> フィールドで Olson タイムゾーン識別子を使用する際、指定されたタイムゾーンに該当する場合、MongoDB は DST オフセットを適用します。
たとえば、次のドキュメントを含む sales コレクションを考えます。
db.sales.insertOne( { "_id" : 1, "item" : "abc", "price" : 10, "quantity" : 2, "date" : ISODate("2014-01-01T08:15:39.736Z") } )
次の集計は、MongoDB がタイムゾーン識別子の DST オフセットを取り扱う方法を示しています。この例では、$hour 演算子と $minute 演算子を使用して、date フィールドの対応する部分を返します。
db.sales.aggregate([ { $project: { "nycHour": { $hour: { date: "$date", timezone: "-05:00" } }, "nycMinute": { $minute: { date: "$date", timezone: "-05:00" } }, "gmtHour": { $hour: { date: "$date", timezone: "GMT" } }, "gmtMinute": { $minute: { date: "$date", timezone: "GMT" } }, "nycOlsonHour": { $hour: { date: "$date", timezone: "America/New_York" } }, "nycOlsonMinute": { $minute: { date: "$date", timezone: "America/New_York" } } } }])
この操作では、次の結果を返します。
{ "_id": 1, "nycHour" : 5, "nycMinute" : 24, "gmtHour" : 10, "gmtMinute" : 24, "nycOlsonHour" : 6, "nycOlsonMinute" : 24 }
例
次の集計では、 $dateFromPartsを使用して、指定された入力フィールドから 3 つの日付オブジェクトを構築します。
db.sales.aggregate([ { $project: { date: { $dateFromParts: { 'year' : 2017, 'month' : 2, 'day': 8, 'hour' : 12 } }, date_iso: { $dateFromParts: { 'isoWeekYear' : 2017, 'isoWeek' : 6, 'isoDayOfWeek' : 3, 'hour' : 12 } }, date_timezone: { $dateFromParts: { 'year' : 2016, 'month' : 12, 'day' : 31, 'hour' : 23, 'minute' : 46, 'second' : 12, 'timezone' : 'America/New_York' } } } }])
この操作では、次の結果を返します。
{ "_id" : 1, "date" : ISODate("2017-02-08T12:00:00Z"), "date_iso" : ISODate("2017-02-08T12:00:00Z"), "date_timezone" : ISODate("2017-01-01T04:46:12Z") }