日付から日を抽出する場合、使用する正確なオプションは、日をどのように表現するかによって異なります。
たとえば、曜日、月の日、または年の日が必要ですか?それとも、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 }