MongoDBでは、$dateFromString
集計パイプライン演算子は、日付/時刻文字列を日付オブジェクトに変換します。
例
foo
というコレクションがあるとします。 次のドキュメントを使用:
{ "_id" : 1, "bar" : "2020-12-31T23:30:25.123" } { "_id" : 2, "bar" : "2020-12-31" } { "_id" : 3, "bar" : "2020-12-31T23:30" }
すべてのドキュメントには日付/時刻の文字列が含まれています。
次のコードを実行して、bar
から日付オブジェクトを返すことができます。 それらのドキュメントのフィールド。
db.foo.aggregate([
{
$project: {
date: {
$dateFromString: {
dateString: '$bar'
}
}
}
}
])
結果:
{ "_id" : 1, "date" : ISODate("2020-12-31T23:30:25.123Z") } { "_id" : 2, "date" : ISODate("2020-12-31T00:00:00Z") } { "_id" : 3, "date" : ISODate("2020-12-31T23:30:00Z") }
すべての日付/時刻文字列が日付オブジェクトに変換されました。
フィールド名もbar
から変更しました date
。
フォーマットを指定する
オプションのformat
を提供できます 提供される日付/時刻文字列の形式を指定する引数。フォーマット指定は、0個以上のフォーマット指定子を含む任意の文字列リテラルにすることができます。
format
パラメータはMongoDBバージョン4.0から利用できます。
デフォルトの形式は%Y-%m-%dT%H:%M:%S.%LZ
です。 、これは前の例で使用されているものです。
次のドキュメントをコレクションに挿入するとします。
{ "_id" : 4, "bar" : "07/08/2020" }
この場合、使用されているロケールに応じて、日付は8か月目の7日、または7か月目の8日になる可能性があります。
フォーマット仕様を使用して、どのフォーマットを指定するかを正確に指定できます。
例:
db.foo.aggregate([
{ $match: { _id: 4 } },
{
$project: {
date: {
$dateFromString: {
dateString: '$bar',
format: "%m/%d/%Y"
}
}
}
}
])
結果:
{ "_id" : 4, "date" : ISODate("2020-07-08T00:00:00Z") }
この場合、7か月目の8日目と指定しました。
ここでもまたですが、今回は日と月を入れ替えます。
db.foo.aggregate([
{ $match: { _id: 4 } },
{
$project: {
date: {
$dateFromString: {
dateString: '$bar',
format: "%d/%m/%Y"
}
}
}
}
])
結果:
{ "_id" : 4, "date" : ISODate("2020-08-07T00:00:00Z") }
今回は、8か月目の7日目と解釈されます。
MongoDB $dateFromString
を参照してください 有効なフォーマット指定子のリストについては、フォーマット指定子。
ISO週の日付形式
ISO8601形式を使用して日付を指定できる形式指定子がいくつかあります。
特に、次を使用できます:
フォーマット指定子 | 出力 |
---|---|
%G | ISO8601形式の年 |
%u | ISO 8601形式の曜日番号(1-月曜日、7-日曜日) |
%V | ISO8601形式の年の週 |
次のようなドキュメントがあるとします。
{ "_id" : 5, "bar" : "7-8-2020" }
その日付は、ISO週の7日目、その年の8番目のISO週、そしてその年であると解釈できます。
このように:
db.foo.aggregate([
{ $match: { _id: 5 } },
{
$project: {
date: {
$dateFromString: {
dateString: '$bar',
format: "%u-%V-%G"
}
}
}
}
])
結果:
{ "_id" : 5, "date" : ISODate("2020-02-23T00:00:00Z") }
タイムゾーンを指定する
$dateFromString
で使用するタイムゾーンを指定できます オペレーター。
タイムゾーンは、Olsonタイムゾーン識別子(例:"Europe/London"
)を使用して指定できます。 、"GMT"
)またはUTCオフセット(例:"+02:30"
、"-1030"
。
オルソンタイムゾーン識別子
次に、それぞれがOlsonタイムゾーンIDを使用する3つの異なるタイムゾーンで日付文字列を出力する例を示します。
db.foo.aggregate([
{ $match: { _id: 1 } },
{
$project: {
utc: {
$dateFromString: {
dateString: '$bar',
timezone: "UTC"
}
},
honolulu: {
$dateFromString: {
dateString: '$bar',
timezone: "Pacific/Honolulu"
}
},
auckland: {
$dateFromString: {
dateString: '$bar',
timezone: "Pacific/Auckland"
}
}
}
}
]).pretty()
結果:
{ "_id" : 1, "utc" : ISODate("2020-12-31T23:30:25.123Z"), "honolulu" : ISODate("2021-01-01T09:30:25.123Z"), "auckland" : ISODate("2020-12-31T10:30:25.123Z") }
UTCオフセット
UTCオフセットを使用する例を次に示します。
db.foo.aggregate([
{ $match: { _id: 1 } },
{
$project: {
"date+00:00": {
$dateFromString: {
dateString: '$bar',
timezone: "+00:00"
}
},
"date-10:00": {
$dateFromString: {
dateString: '$bar',
timezone: "-10:00"
}
},
"date+12:00": {
$dateFromString: {
dateString: '$bar',
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") }
timezone
を使用する場合 パラメータの場合、日付文字列にZを追加してズールー時間(UTCタイムゾーン)を示すことはできません。たとえば、日付文字列を2020-12-31T23:30:25.123Z
にすることはできません。 タイムゾーンパラメータを使用する場合。
また、タイムゾーンパラメータを使用するときは、日付文字列にタイムゾーン情報を含めないでください。
onNull
パラメータ
onNull
パラメータを使用して、日付がnullまたは存在しない場合に何を返すかを指定できます。
onNull
に提供される値 パラメータは任意の有効な式にすることができます。
次のようなドキュメントがあるとします。
{ "_id" : 6, "bar" : null }
onNull
を使用できます 次のように:
db.foo.aggregate([
{ $match: { _id: 6 } },
{
$project: {
date: {
$dateFromString: {
dateString: '$bar',
onNull: "No valid date was supplied"
}
}
}
}
])
結果:
{ "_id" : 6, "date" : "No valid date was supplied" }
この場合、日付はnull
でした したがって、出力ドキュメントには、onNull
に指定した文字列が含まれます。 パラメータ。
onError
パラメータ
オプションでonError
を使用できます エラーが発生した場合に出力する式を提供するパラメーター。
コレクションに次のドキュメントが含まれているとします。
{ "_id" : 7, "bar" : "21st Dec, 2030" }
bar
に日付がありますが フィールドの場合、これは有効な日付/時刻文字列ではないため、dateFromString
を使用するとエラーが発生します 日付オブジェクトに変換しようとします。
エラーの例:
db.foo.aggregate([
{ $match: { _id: 7 } },
{
$project: {
date: {
$dateFromString: {
dateString: '$bar'
}
}
}
}
])
結果:
Error: command failed: { "ok" : 0, "errmsg" : "an incomplete date/time string has been found, with elements missing: \"21st Dec, 2030\"", "code" : 241, "codeName" : "ConversionFailure" } : aggregate failed : [email protected]/mongo/shell/utils.js:25:13 [email protected]/mongo/shell/assert.js:18:14 [email protected]/mongo/shell/assert.js:618:17 [email protected]/mongo/shell/assert.js:708:16 [email protected]/mongo/shell/db.js:266:5 [email protected]/mongo/shell/collection.js:1046:12 @(shell):1:1
それは厄介な見た目のエラーです。
onError
を使用できます 見栄えを良くするためのパラメータ:
db.foo.aggregate([
{ $match: { _id: 7 } },
{
$project: {
date: {
$dateFromString: {
dateString: '$bar',
onError: "An error occurred while parsing the date string"
}
}
}
}
])
結果:
{ "_id" : 7, "date" : "An error occurred while parsing the date string" }
onNull
として表示 およびonError
パラメータを使用すると、実際のドキュメントを返すことができ、1つの不正なドキュメントが操作全体を停止することを心配することなく、複数のドキュメントを返すことができます。
例:
db.foo.aggregate([
{
$project: {
date: {
$dateFromString: {
dateString: '$bar',
onNull: "The date was either empty or null",
onError: "An error occurred while parsing the date string"
}
}
}
}
])
結果:
{ "_id" : 1, "date" : ISODate("2020-12-31T23:30:25.123Z") } { "_id" : 2, "date" : ISODate("2020-12-31T00:00:00Z") } { "_id" : 3, "date" : ISODate("2020-12-31T23:30:00Z") } { "_id" : 4, "date" : ISODate("2020-07-08T00:00:00Z") } { "_id" : 5, "date" : ISODate("2020-08-07T00:00:00Z") } { "_id" : 6, "date" : "The date was either empty or null" } { "_id" : 7, "date" : "An error occurred while parsing the date string" }