これを行うにはいくつかの方法があります。
1つは、日付集計演算子を使用する方法です。これにより、ドキュメント内の「日付」値を分析できます。特に主な目的としての「グループ化」の場合:
db.collection.aggregate([
{ "$group": {
"_id": {
"year": { "$year": "$created_at" },
"dayOfYear": { "$dayOfYear": "$created_at" },
"hour": { "$hour": "$created_at" },
"interval": {
"$subtract": [
{ "$minute": "$created_at" },
{ "$mod": [{ "$minute": "$created_at"}, 15] }
]
}
}},
"count": { "$sum": 1 }
}}
])
2番目の方法は、日付オブジェクトが別の日付オブジェクトから減算される(または他の直接数学演算)ときのちょっとしたトリックを使用することです。結果は、2つのオブジェクト間のエポックタイムスタンプミリ秒を表す数値になります。したがって、エポック日付を使用するだけで、エポックミリ秒表現が得られます。次に、間隔に日付計算を使用します:
db.collection.aggregate([
{ "$group": {
"_id": {
"$subtract": [
{ "$subtract": [ "$created_at", new Date("1970-01-01") ] },
{ "$mod": [
{ "$subtract": [ "$created_at", new Date("1970-01-01") ] },
1000 * 60 * 15
]}
]
},
"count": { "$sum": 1 }
}}
])
したがって、グループ化間隔に必要な出力形式の種類によって異なります。どちらも基本的に同じものを表しており、コード内の「日付」オブジェクトとして再構築するのに十分なデータがあります。
_id
をグループ化した後、「グループ化演算子」の部分に他に必要なものを入れることができます 。私は、あなたが本当にやりたいことについてのあなた自身からの実際の声明の代わりに、基本的な「カウント」の例を使用しています。
MongoDB4.x以降
最初の記述以降、日付集約演算子にいくつかの追加がありましたが、MongoDB 4.0からは、BSON日付変換でここで行われる基本的な数学のトリックとは対照的に、実際の「型の実際のキャスト」が行われます。
たとえば、$toLong
を使用できます および$toDate
ここで新しいヘルパーとして:
db.collection.aggregate([
{ "$group": {
"_id": {
"$toDate": {
"$subtract": [
{ "$toLong": "$created_at" },
{ "$mod": [ { "$toLong": "$created_at" }, 1000 * 60 * 15 ] }
]
}
},
"count": { "$sum": 1 }
}}
])
これは少し短く、パイプラインを定義する際の定数として「エポック」値の外部BSON日付を定義する必要がないため、すべての言語実装でかなり一貫性があります。
これらは、型変換の「ヘルパー」メソッドの2つにすぎず、すべて$convert
に関連付けられています。 メソッド。これは実装の「より長い」形式であり、null
でのカスタム処理を可能にします。 または変換エラー。
このようなキャストを使用して、Date
を取得することも可能です。 ObjectId
からの情報 これは「作成」日付の信頼できるソースになるため、主キーの:
db.collection.aggregate([
{ "$group": {
"_id": {
"$toDate": {
"$subtract": [
{ "$toLong": { "$toDate": "$_id" } },
{ "$mod": [ { "$toLong": { "$toDate": "$_id" } }, 1000 * 60 * 15 ] }
]
}
},
"count": { "$sum": 1 }
}}
])
したがって、この種の変換を使用した「キャストタイプ」は、非常に強力なツールになる可能性があります。
警告 -
ObjectId
値は秒の精度に制限されます$toDate
を許可するデータの一部を構成する内部時間値のみ 変換。実際に挿入される「時間」は、おそらく使用中のドライバーによって異なります。 精度 必須ですが、ObjectId
に依存するのではなく、個別のBSONDateフィールドを使用することをお勧めします。 値。