$dateFromString(集計)
定義
$dateFromString
日付/時刻文字列をオブジェクトに変換します。
$dateFromString
式の構文は次のとおりです。{ $dateFromString: { dateString: <dateStringExpression>, format: <formatStringExpression>, timezone: <tzExpression>, onError: <onErrorExpression>, onNull: <onNullExpression> } } $dateFromString
は、次のフィールドを持つドキュメントを取得します。フィールド説明dateString
日付オブジェクトに変換する日付や時刻の文字列。日付や時刻の形式の詳細については、
Date()
を参照してください。演算子に
timezone
オプションを指定する場合は、dateString
にタイムゾーン情報を含めないでください。format
任意。
dateString
の日付形式の仕様。format
は、 0以上の形式指定子を含む string リテラルに評価される任意の式です。 使用可能な指定子のリストについては、「形式指定子 」を参照してください。指定されていない場合、
$dateFromString
はデフォルト形式として"%Y-%m-%dT%H:%M:%S.%LZ"
を使用しますが、さまざまな形式を受け入れ、可能な場合はdateString
の解析を試みます。timezone
任意。日付の形式に使用するタイムゾーン。
dateString
引数が "2017-02-08T12:10:40.787Z" のように形式されている場合(末尾の "Z" は協定世界時(UTC タイムゾーン)を表します)、timezone
引数は指定できません。<timezone>
次のオプションとそれを評価する式が使用できます。Olson タイムゾーン識別子 、たとえば
"Europe/London"
や など、"America/New_York"
または次の形式の UTC オフセット:
+/-[hh]:[mm]
、例:"+04:45"
、または+/-[hh][mm]
、例:"-0530"
、または+/-[hh]
、例:"+03"
、または
文字列
"Z"
、"UTC"
、または"GMT"
式の詳細については、「式演算子」を参照してください。
onError
任意。 指定された
dateString
を解析中に$dateFromString
がエラーに遭遇した場合、それは指定されたonError
式の結果の値を出力します。 この結果値は任意のタイプにすることができます。onError
を指定しないと、dateString
を解析できない場合に$dateFromString
がエラーをスローします。onNull
任意。
$dateFromString
に提供されたdateString
がnull
または欠落している場合、提供されたonNull
式の結果の値が出力されます。 この結果値は任意のタイプにすることができます。onNull
を指定せず、dateString
がnull
または欠落している場合、$dateFromString
はnull
を出力します。
動作
例 | 結果 | ||||
---|---|---|---|---|---|
| ISODate("2017-02-08T12:10:40.787Z") | ||||
| ISODate("2017-02-08T17:10:40.787Z") | ||||
| ISODate("2017-02-08T00:00:00Z") | ||||
| ISODate("2020-10-20T00:00:00.000Z") | ||||
| ISODate("2018-06-15T00:00:00Z") | ||||
| ISODate("2018-06-15T00:00:00Z") | ||||
| ISODate("1996-01-31T08:35:28.000Z") |
フォーマット指定子
<formatString>
0で使える書式指定子は以下の通りでし。
指定子 | 説明 | Possible Values |
---|---|---|
%b | 省略表記の月(3 文字) | jan , feb , mar , apr , may , jun , jul , aug , sep , oct , nov , dec |
%B | 正式な月名 | january -december |
%d | 日付(2桁、ゼロあり) | 01 -31 |
%G | ISO 8601 形式の年 | 0000 -9999 |
%H | 時間(2 桁、ゼロあり、24 時間表記) | 00 -23 |
%j | 年内の日(3桁、ゼロ埋め) | 001 -366 |
%L | ミリ秒 (3 桁、ゼロ埋め込み) | 000 -999 |
%m | 月 (2 桁、ゼロ埋め込み) | 01 -12 |
%M | 分(2桁、ゼロ埋め込み) | 00 -59 |
%S | 秒(2 桁、ゼロ埋め込み) | 00 -60 |
%u | ISO 8601 形式の曜日番号(1 - 月曜日、7 - 日曜日) | 1 -7 |
%U | 年内の週(2 桁、ゼロ埋め込み) | 00 -53 |
%V | ISO 8601形式の年内の週 | 1 -53 |
%w | 整数で表された曜日(0:日曜日、6:土曜日) | 0 -6 |
%Y | 年(4 桁、ゼロ埋め込み) | 0000 -9999 |
%z | UTC からのタイムゾーン オフセット。 | +/-[hh][mm] |
%Z | UTC からのオフセットを数値として表した分。たとえば、タイムゾーン オフセット ( +/-[hhmm] ) が+0445 の場合、分オフセットは+285 になります。 | +/-mmm |
%% | リテラルパーセント文字 | % |
例
日付の変換
以下の日付入りドキュメントを含むコレクション logmessages
について考えます。
{ _id: 1, date: "2017-02-08T12:10:40.787", timezone: "America/New_York", message: "Step 1: Started" }, { _id: 2, date: "2017-02-08", timezone: "-05:00", message: "Step 1: Ended" }, { _id: 3, message: " Step 1: Ended " }, { _id: 4, date: "2017-02-09", timezone: "Europe/London", message: "Step 2: Started"}, { _id: 5, date: "2017-02-09T03:35:02.055", timezone: "+0530", message: "Step 2: In Progress"}
次の集計では、$dateFromString を使用して date
値を日付オブジェクトに変換します。
db.logmessages.aggregate( [ { $project: { date: { $dateFromString: { dateString: '$date', timezone: 'America/New_York' } } } } ] )
上記の集計により、次のドキュメントが返され、各 date
フィールドが東部標準時に変換されます。
{ "_id" : 1, "date" : ISODate("2017-02-08T17:10:40.787Z") } { "_id" : 2, "date" : ISODate("2017-02-08T05:00:00Z") } { "_id" : 3, "date" : null } { "_id" : 4, "date" : ISODate("2017-02-09T05:00:00Z") } { "_id" : 5, "date" : ISODate("2017-02-09T08:35:02.055Z") }
ハードコードされた引数の代わりに、ドキュメント フィールドを介してtimezone
引数も利用できます。たとえば次のとおりです。
db.logmessages.aggregate( [ { $project: { date: { $dateFromString: { dateString: '$date', timezone: '$timezone' } } } } ] )
上記の集計により、次のドキュメントが返され、各 date
フィールドがそれぞれの UTC 表現に変換されます。
{ "_id" : 1, "date" : ISODate("2017-02-08T17:10:40.787Z") } { "_id" : 2, "date" : ISODate("2017-02-08T05:00:00Z") } { "_id" : 3, "date" : null } { "_id" : 4, "date" : ISODate("2017-02-09T00:00:00Z") } { "_id" : 5, "date" : ISODate("2017-02-08T22:05:02.055Z") }
onError
コレクションに解析できない日付文字列を持つドキュメントが含まれている場合は、任意の$dateFromString
onError
パラメータに 集計式 を指定しない限り、 はエラーをスローします。
たとえば、次のドキュメントが含まれたコレクション dates
を想定します。
{ "_id" : 1, "date" : "2017-02-08T12:10:40.787", timezone: "America/New_York" }, { "_id" : 2, "date" : "20177-02-09T03:35:02.055", timezone: "America/New_York" }
無効な日付を元の文字列形式で返すには、 onError
パラメータを使用します。
db.dates.aggregate( [ { $project: { date: { $dateFromString: { dateString: '$date', timezone: '$timezone', onError: '$date' } } } } ] )
これにより、次のドキュメントが返されます。
{ "_id" : 1, "date" : ISODate("2017-02-08T17:10:40.787Z") } { "_id" : 2, "date" : "20177-02-09T03:35:02.055" }
onNull
コレクションにnull
の日付文字列を持つドキュメントが含まれている場合、任意の$dateFromString
パラメータにnull
集計式 を指定しない限り、onNull
は を返します。
たとえば、次のドキュメントが含まれたコレクション dates
を想定します。
{ "_id" : 1, "date" : "2017-02-08T12:10:40.787", timezone: "America/New_York" }, { "_id" : 2, "date" : null, timezone: "America/New_York" }
$dateFromString
が null
の代わりに UNIXエポックを表す日付を返す場合、onNull
パラメータを使用します。
db.dates.aggregate( [ { $project: { date: { $dateFromString: { dateString: '$date', timezone: '$timezone', onNull: new Date(0) } } } } ] )
これにより、次のドキュメントが返されます。
{ "_id" : 1, "date" : ISODate("2017-02-08T17:10:40.787Z") } { "_id" : 2, "date" : ISODate("1970-01-01T00:00:00Z") }