MongoDBでは、$dateToString
集計パイプライン演算子は、指定された日付オブジェクトを文字列に変換します。
$dateToString
演算子は、日付、タイムスタンプ、またはObjectIdのいずれかを受け入れます。
フォーマット指定を提供することにより、結果に使用するフォーマットを指定できます。フォーマット指定は、0個以上のフォーマット指定子を含む任意の文字列リテラルにすることができます。
featureCompatibilityVersion
の場合、フォーマット仕様はMongoDBバージョン4.0からオプションです。 4.0
に設定されています 以上。以前のバージョンではフォーマット仕様が必要です。
オプションでtimezone
を使用できます 使用するタイムゾーンを指定するパラメータ。
onNull
を使用することもできます 日付がnull
の場合に何を返すかを指定するパラメーター または行方不明。
例
pets
というコレクションがあるとします。 次のドキュメントで:
{ "_id" : ObjectId("600631c7c8eb4369cf6ad9c8"), "name" : "Fetch", "born" : ISODate("2020-12-31T23:30:15.123Z") }
次のコードを実行して、born
から日付文字列を返すことができます。 そのドキュメントのフィールド。
db.pets.aggregate(
[
{
$project: {
_id: 0,
dateString: { $dateToString: { format: "%Y-%m-%dT%H:%M:%S.%LZ", date: "$born" } }
}
}
]
)
結果:
{ "dateString" : "2020-12-31T23:30:15.123Z" }
この例では、%Y-%m-%dT%H:%M:%S.%LZ
を使用しています。 フォーマット仕様として。これはたまたまデフォルトのフォーマット仕様ですが、この場合は明示的に指定しました。指定された形式を使用して日付文字列が返されることがわかります。
ここでは、dateString
を使用しました 返すフィールド名として、ただしこれは何でもかまいません(formattedDate
など)。 、theDate
等)。
_id
MongoDBでプロジェクションを使用すると、デフォルトでフィールドが返されますが、この例では、_id
を明示的に非表示にしました。 _id: 0
を使用するフィールド 。
MongoDB $dateToString
を参照してください 使用可能なフォーマット指定子のリストについては、フォーマット指定子。
デフォルト出力
前述のように、前の例のフォーマット仕様はデフォルトのフォーマット仕様です。
featureCompatibilityVersion
を使用してMongoDBバージョン4.0以降を使用している場合 4.0
に設定 以上(現在のfeatureCompatibilityVersion
を表示する方法を参照してください とその設定方法)、上記の形式を使用して日付をフォーマットする場合は、フォーマット指定を省略できます。
したがって、前のものを書き直すことができます。この例:
db.pets.aggregate(
[
{
$project: {
_id: 0,
dateString: { $dateToString: { date: "$born" } }
}
}
]
)
結果:
{ "dateString" : "2020-12-31T23:30:15.123Z" }
タイムゾーンを指定する
$dateToString
の出力に使用するタイムゾーンを指定できます オペレーター。
タイムゾーンは、Olsonタイムゾーン識別子(例:"Europe/London"
)を使用して指定できます。 、"GMT"
)またはUTCオフセット(例:"+02:30"
、"-1030"
。
オルソンタイムゾーン識別子
次に、それぞれがOlsonタイムゾーンIDを使用する3つの異なるタイムゾーンで日付文字列を出力する例を示します。
db.pets.aggregate(
[
{
$project: {
_id: 0,
UTC: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "UTC" } },
Honolulu: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "Pacific/Honolulu" } },
Auckland: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "Pacific/Auckland" } }
}
}
]
).pretty()
結果:
{ "UTC" : "2020-12-31T23:30", "Honolulu" : "2020-12-31T13:30", "Auckland" : "2021-01-01T12:30" }
UTCオフセット
UTCオフセットを使用する例を次に示します。
db.pets.aggregate(
[
{
$project: {
_id: 0,
UTC: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "+00:00" } },
Honolulu: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "-10:00" } },
Auckland: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "+12:00" } }
}
}
]
).pretty()
結果:
{ "UTC" : "2020-12-31T23:30", "Honolulu" : "2020-12-31T13:30", "Auckland" : "2021-01-01T11:30" }
ISO週の日付形式
ISO8601形式を使用して日付文字列を出力できるようにする形式指定子がいくつかあります。
特に、次を使用できます:
フォーマット指定子 | 出力 |
---|---|
%G | ISO8601形式の年 |
%u | ISO 8601形式の曜日番号(1-月曜日、7-日曜日) |
%V | ISO8601形式の年の週 |
cats
というコレクションがあるとします。 次のドキュメントで:
{ "_id" : ObjectId("6008c9a5c8eb4369cf6ad9cc"), "name" : "Scratch", "born" : ISODate("2021-01-03T23:30:15.123Z") }
次のコードを実行して、born
からISO日付フィールドを抽出できます。 そのドキュメントのフィールド。
デモンストレーションの例を次に示します。
db.cats.aggregate(
[
{
$project: {
_id: 0,
isoYear: { $dateToString: { format: "%G", date: "$born" } },
isoDayOfWeek: { $dateToString: { format: "%u", date: "$born" } },
isoWeekOfYear: { $dateToString: { format: "%V", date: "$born" } }
}
}
]
)
結果:
{ "isoYear" : "2020", "isoDayOfWeek" : "7", "isoWeekOfYear" : "53" }
対照的に、以下は同じ例ですが、ISO以外の週の日付部分を使用しています。
db.cats.aggregate(
[
{
$project: {
_id: 0,
year: { $dateToString: { format: "%Y", date: "$born" } },
dayofweek: { $dateToString: { format: "%w", date: "$born" } },
weekofyear: { $dateToString: { format: "%U", date: "$born" } }
}
}
]
)
結果:
{ "year" : "2021", "dayofweek" : "1", "weekofyear" : "01" }
結果が完全に異なることがわかります。
onNull
パラメータ
onNull
パラメータを使用して、日付がnullまたは存在しない場合に何を返すかを指定できます。
onNull
に提供される値 パラメータは任意の有効な式にすることができます。
次に例を示します:
db.pets.aggregate(
[
{
$project: {
_id: 0,
dateString: { $dateToString: { date: null, onNull: "No date supplied" } }
}
}
]
)
結果:
{ "dateString" : "No date supplied" }
この場合、日付はnull
でした したがって、出力ドキュメントには、onNull
に指定した文字列が含まれます。 パラメータ。
ObjectIdから日付パーツを返す
$dateToString
を使用できます ObjectIdから日付文字列を返します。
ObjectId値は、以下で構成される12バイトの16進値です。
- ObjectIdの作成を表す4バイトのタイムスタンプ値で、Unixエポックからの秒数で測定されます。
- 5バイトはランダムな値です
- ランダムな値に初期化された3バイトのインクリメントカウンター。
要約すると、最初のドキュメントは次のようになります。
{ "_id" : ObjectId("600631c7c8eb4369cf6ad9c8"), "name" : "Fetch", "born" : ISODate("2020-12-31T23:30:15.123Z") }
このドキュメントにはObjectIdが含まれています。したがって、$dateToString
を使用できます ドキュメントが作成された日付に基づいて(より具体的には、_id
の場合)、日付文字列を返します。 フィールドのObjectId値が作成されました。
例:
db.pets.aggregate(
[
{
$project: {
timestamp: { $toDate: "$_id" },
dateString: { $dateToString: { format: "%d-%m-%Y", date: "$_id" } }
}
}
]
).pretty()
結果:
{ "_id" : ObjectId("600631c7c8eb4369cf6ad9c8"), "timestamp" : ISODate("2021-01-19T01:11:35Z"), "dateString" : "19-01-2021" }
この場合、(時間の部分ではなく)日付の部分だけを返すことにしました。また、必要に応じて確実にこれを実行できることを示すために、日、月、年の順序を切り替えました。
$toDate
も使用しました ObjectIdのタイムスタンプ部分を返す集約パイプライン演算子。