$dateFromParts(集計)
定義
$dateFromParts
バージョン 3.6 の新機能。
日付の構成プロパティを指定して 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
を使用していない場合は必須isoWeekYear
isoWeekYear
を使用していない場合は必須year
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
コレクションを考えます。
{ "_id" : 1, "item" : "abc", "price" : 20, "quantity" : 5, "date" : ISODate("2017-05-20T10:24:51.303Z") }
次の集計は、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") }