日付から日を抽出する場合、使用する正確なオプションは、日をどのように表現するかによって異なります。
たとえば、曜日、月の日、または年の日が必要ですか?それとも、ISO 8601形式で欲しいですか?戻り値は通常、どちらを選択するかによって異なります。
この記事ではこれらのオプションについて説明しているため、MongoDBの日付から1日の部分を返す8つの方法を紹介します。
サンプルデータ
catsというコレクションがあるとします。 次のドキュメントを使用:
{ "_id" : 1, "name" : "Scratch", "born" : ISODate("2021-01-03T23:30:15.123Z") }
{ "_id" : 2, "name" : "Meow", "born" : ISODate("2019-12-08T04:00:12Z") }
{ "_id" : 3, "name" : "Fluffy", "born" : ISODate("2020-09-24T10:30:00Z") }
次の例は、 bornから1日の部分を返すためのさまざまなオプションを示しています。 それらのドキュメントのフィールド。
$ dayOfWeek オペレーター
名前が示すように、 $ dayOfWeek 演算子は、日付から曜日を返します。
次のコードを実行して、 bornから曜日を返すことができます。 上記のドキュメントのフィールド。
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthDayOfWeek: { $dayOfWeek: "$born" }
}
}
]
) 結果:
{ "birthDayOfWeek" : 1 }
{ "birthDayOfWeek" : 1 }
{ "birthDayOfWeek" : 5 }
$ dayOfWeekを使用するときにタイムゾーンを指定することもできます オペレーター。
MongoDB $ dayOfWeekを参照してください 詳細と例については。
$ dayOfMonth オペレーター
$ dayOfMonth 演算子は、日付から月の日を返します。
例:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthDayOfMonth: { $dayOfMonth: "$born" }
}
}
]
) 結果:
{ "birthDayOfMonth" : 3 }
{ "birthDayOfMonth" : 8 }
{ "birthDayOfMonth" : 24 }
$ dayOfMonthを使用するときにタイムゾーンを指定することもできます オペレーター。
MongoDB $ dayOfMonthを参照してください 詳細と例については。
$ dayOfYear オペレーター
うん、あなたはそれを推測した。 $ dayOfYear 演算子は、日付から年の日を返します。
例:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthDayOfYear: { $dayOfYear: "$born" }
}
}
]
) 結果:
{ "birthDayOfYear" : 3 }
{ "birthDayOfYear" : 342 }
{ "birthDayOfYear" : 268 }
$ dayOfYear 演算子はタイムゾーンパラメータも受け入れます。
MongoDB $ dayOfYearを参照してください 詳細と例については。
$ dateToString オペレーター
$ dateToString 演算子は、ユーザー指定の形式に従って日付オブジェクトを文字列に変換します。したがって、ユーザーは、必要に応じて1日の部分だけを返すように指定できます。
日付部分ごとにフォーマット指定子があり、日部分に関しては、曜日、曜日、曜日、または曜日を返すかどうかに応じて、フォーマット指定子を選択できます。 ISO8601形式の曜日。
例:
db.cats.aggregate(
[
{
$project: {
_id: 0,
birthDayOfWeek: { $dateToString: { format: "%w", date: "$born" } },
birthDayOfMonth: { $dateToString: { format: "%d", date: "$born" } },
birthDayOfYear: { $dateToString: { format: "%j", date: "$born" } },
birthDayOfWeekISO: { $dateToString: { format: "%u", date: "$born" } }
}
}
]
).pretty() 結果:
{
"birthDayOfWeek" : "1",
"birthDayOfMonth" : "03",
"birthDayOfYear" : "003",
"birthDayOfWeekISO" : "7"
}
{
"birthDayOfWeek" : "1",
"birthDayOfMonth" : "08",
"birthDayOfYear" : "342",
"birthDayOfWeekISO" : "7"
}
{
"birthDayOfWeek" : "5",
"birthDayOfMonth" : "24",
"birthDayOfYear" : "268",
"birthDayOfWeekISO" : "4"
} 結果に他の日付部分を含めるために、より多くの形式指定子を提供することもできますが、この記事では日を抽出することにのみ関心があるため、日部分を返すために形式指定子のみを使用しました。
MongoDB $ dateToStringを参照してください 詳細と例については。
MongoDB $ dateToStringも参照してください $ dateToStringで使用できるフォーマット指定子のリストのフォーマット指定子 。
$ dateToParts オペレーター
$ dateToParts 演算子は、指定されたBSON日付値の構成部分を個別のプロパティとして含むドキュメントを返します。返されるプロパティはyearです 、 month 、 day 、時間 、分コード> 、 second およびmillisecond 。
したがって、 $ dateToPartsを使用できます 1つのパイプラインステージで、 dayを抽出する別のパイプラインステージを追加します 必要に応じて一部。
$ dateToPartsは次のとおりです 3つのドキュメントの返品:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
dateParts: { $dateToParts: { date: "$born" } }
}
}
]
).pretty() 結果:
{
"dateParts" : {
"year" : 2021,
"month" : 1,
"day" : 3,
"hour" : 23,
"minute" : 30,
"second" : 15,
"millisecond" : 123
}
}
{
"dateParts" : {
"year" : 2019,
"month" : 12,
"day" : 8,
"hour" : 4,
"minute" : 0,
"second" : 12,
"millisecond" : 0
}
}
{
"dateParts" : {
"year" : 2020,
"month" : 9,
"day" : 24,
"hour" : 10,
"minute" : 30,
"second" : 0,
"millisecond" : 0
}
}
このデータをパイプラインの次のステージに渡して、 dayだけを抽出できます。 フィールド。
dayだけに別の予測を追加するとどうなりますか フィールド:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
dateParts: { $dateToParts: { date: "$born" } }
}
},
{
$project:
{
birthDay: "$dateParts.day"
}
}
]
) 結果:
{ "birthDay" : 3 }
{ "birthDay" : 8 }
{ "birthDay" : 24 } これは明らかに、前のオプションを使用するほど簡潔ではありません。ただし、パイプラインで何をしているのかによっては、このアプローチが選択肢になる可能性があります。
$ dateToPartsにも言及する価値があります iso8601を受け入れます パラメータ。ISO週の日付フィールドを使用するように出力ドキュメントを変更します。
MongoDB $ dateToPartsを参照してください 詳細と例については。
forEach() 方法
cursor.forEach()を使用できます JavaScriptメソッドを使用してカーソルを反復処理し、日の値のみを返します。
db.cats.find().forEach(
function(c) {
print(
c.born.getDay()
);
}
); 結果:
1 0 4
この場合、JavaScriptの getDay()を使用します メソッド。現地時間に応じて、指定された日付の曜日に対応する0〜6の整数を返します。
もう1つのオプションは、 getUTCDay()を使用することです。 普遍的な時間を使用する方法。次の例では、この方法を使用します。
または、JavaScriptの getDate()を使用することもできます。 メソッド。指定された日付の月の日を表す1〜31の整数を返します。
また、このオプションは、前の例のようにドキュメント全体ではなく、実際の日の値のみを返します。
map() 方法
cursor.map() メソッドは、カーソルがアクセスした各ドキュメントに関数を適用し、値を配列に結合します。
例:
db.cats.find().map(
function(c) {
c = c.born.getUTCDay();
return c;
}
); 結果:
[ 0, 0, 4 ]
前述のように、JavaScriptの getUTCDay() メソッドは、ユニバーサル時間を使用して結果を返します。この場合、最初のドキュメントに対して異なる値が返されます( 0 を取得しました) この例では、 1に対して 前のもので)。
$ isoDayOfWeek オペレーター
曜日をISO8601形式で返す必要がある場合は、 $ isoDayOfWeekを使用できます。 。 ISO 8601年は、第1週の月曜日に始まり、先週の日曜日に終わります。
例:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthIsoDayOfWeek: { $isoDayOfWeek: "$born" }
}
}
]
) 結果:
{ "birthIsoDayOfWeek" : 7 }
{ "birthIsoDayOfWeek" : 7 }
{ "birthIsoDayOfWeek" : 4 }
この場合、 $ dayOfWeekを使用した場合とはまったく異なる結果が得られます。 ISO8601が日付を計算する方法のために演算子。
この違いを示す例を次に示します。
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthDayOfWeek: { $dayOfWeek: "$born" },
birthIsoDayOfWeek: { $isoDayOfWeek: "$born" }
}
}
]
) 結果:
{ "birthDayOfWeek" : 1, "birthIsoDayOfWeek" : 7 }
{ "birthDayOfWeek" : 1, "birthIsoDayOfWeek" : 7 }
{ "birthDayOfWeek" : 5, "birthIsoDayOfWeek" : 4 }