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のタイムスタンプ部分を返す集約パイプライン演算子。