MongoDB でタイムスタンプを日付に変換する
- MongoDB でタイムスタンプを日付に変換する
- タイムスタンプがタイプ番号の場合、タイムスタンプを日付に変換する
- タイムスタンプが文字列型の場合、タイムスタンプを日付に変換する
- タイムスタンプがオブジェクト型の場合、タイムスタンプを日付に変換する
このチュートリアルでは、MongoDB でタイムスタンプを日付に変換する方法を示します。また、特定の日付のエントリをカウントする方法も示しています。
MongoDB でタイムスタンプを日付に変換する
timestamp から date への変換は、タイムスタンプを保存したタイプによって異なります。タイプはオブジェクト、数値、または文字列ですか?
mongo シェルで次のコマンドを使用して、フィールドのタイプを確認できます。このチュートリアルでは、タイムスタンプのタイプが数値、文字列、またはオブジェクトの場合に、タイムスタンプを日付に変換する方法を学習します。
フィールドのタイプを確認してください。
// MongoDB 5.0.8
> typeof db.collection_name.findOne().fieldName;
タイムスタンプがタイプ番号の場合、タイムスタンプを日付に変換する
サンプルコード(collection1
の場合):
// MongoDB 5.0.8
> db.collection1.insertMany([
{"_id": 1, "datetime": new Date().getTime()}, //saves timestamp in milliseconds
{"_id": 2, "datetime": new Date().getTime()},
{"_id": 3, "datetime": new Date().getTime()},
{"_id": 4, "datetime": new Date().getTime()},
{"_id": 5, "datetime": new Date().getTime()}
]);
> db.collection1.find();
出力:
{ "_id" : 1, "datetime" : 1655448286502 }
{ "_id" : 2, "datetime" : 1655448286502 }
{ "_id" : 3, "datetime" : 1655448286502 }
{ "_id" : 4, "datetime" : 1655448286502 }
{ "_id" : 5, "datetime" : 1655448286502 }
datetime
フィールドのタイプを確認してください。
// MongoDB 5.0.8
> typeof db.collection1.findOne().datetime;
出力:
number
コレクションの準備が整い、フィールドタイプがわかったら、次のアプローチを使用してタイムスタンプから日付に変換し、日付ごとにエントリをカウントできます。
サンプルコード(collection1
の場合):
// MongoDB 5.0.8
> db.collection1.aggregate([
{
"$project": {
"_id": { "$toDate": "$datetime" }
}
},
{
"$group": {
"_id": { "$dateToString": { "format": "%Y-%m-%d", "date": "$_id" }},
"count": { "$sum": 1 }
}
}
]);
出力:
{ "_id" : "2022-06-17", "count" : 5 }
ここでは、指定されたコレクションからドキュメントを取得し、フィールドの包含、_id
フィールドの抑制、新しいフィールドの追加、および既存のフィールドの値のリセットを通知する $project
集計ステージを使用します。
$project
ステージ内で、$toDate
集計を使用して datetime
フィールドの値を日付に変換し、_id
フィールドに保存します。このフィールドはさらに $group
集計ステージに渡されます。
この段階では、$dateToString
集計パイプライン演算子を使用して、指定された date
オブジェクトを指定された形式に従って文字列に変換し、_id
フィールドに保存します。このフィールドは、ドキュメントのグループ化にさらに使用されます。
$dateToString
は timestamp
、date
、または ObjectId
のいずれかを取り、ユーザー指定の形式を考慮してさらに変換されますが、$sum
は数値の合計のみを返します。
最後に、ここでは _id
であるアイテムごとにドキュメントをグループ化します。指定された日付をユーザー指定の形式ごとに文字列に変換したため、_id
に文字列値が含まれるようになったことを思い出してください。
タイムスタンプが文字列型の場合、タイムスタンプを日付に変換する
サンプルコード(collection2
の場合):
// MongoDB 5.0.8
> db.collection2.insertMany([
{"_id": 1, "datetime": "1655445247168"},
{"_id": 2, "datetime": "1522838153324"},
{"_id": 3, "datetime": "1513421466415"},
{"_id": 4, "datetime": "1515488183153"},
{"_id": 5, "datetime": "1521571234500"}
]);
> db.collection2.find();
出力:
{ "_id" : 1, "datetime" : "1655445247168" }
{ "_id" : 2, "datetime" : "1522838153324" }
{ "_id" : 3, "datetime" : "1513421466415" }
{ "_id" : 4, "datetime" : "1515488183153" }
{ "_id" : 5, "datetime" : "1521571234500" }
datetime
フィールドのタイプを確認してください。
// MongoDB 5.0.8
> typeof db.collection2.findOne().datetime;
出力:
string
このコレクションには、文字列形式のタイムスタンプがあります。したがって、次のソリューションを使用して、タイムスタンプから日付に変換し、日付ごとにグループ化できます。
サンプルコード(collection2
の場合):
// MongoDB 5.0.8
> db.collection2.aggregate([
{
"$project": {
"_id": { "$toDate": { "$toLong": "$datetime" }}
}
},
{
"$group": {
"_id": { "$dateToString": { "format": "%Y-%m-%d", "date": "$_id" } },
"count": { "$sum": 1 }
}
}
]);
出力:
{ "_id" : "2018-03-20", "count" : 1 }
{ "_id" : "2017-12-16", "count" : 1 }
{ "_id" : "2022-06-17", "count" : 1 }
{ "_id" : "2018-04-04", "count" : 1 }
{ "_id" : "2018-01-09", "count" : 1 }
このコードは、1つの違いを除いて、前の例と同じです。ここでは、$toLong
を使用して datetime
フィールドを文字列から数値タイプに最初に変換し、次にその変換された値を使用して $toDate
を使用して日付に変換しています。
タイムスタンプがオブジェクト型の場合、タイムスタンプを日付に変換する
サンプルコード(collection3
用):
// MongoDB 5.0.8
> db.collection3.insertMany([
{"_id":1, "datetime": new Timestamp()},
{"_id":2, "datetime": new Timestamp()},
{"_id":3, "datetime": new Timestamp()},
{"_id":4, "datetime": new Timestamp()},
{"_id":5, "datetime": new Timestamp()}
]);
> db.collection3.find();
出力:
{ "_id" : 1, "datetime" : Timestamp(1655448393, 1) }
{ "_id" : 2, "datetime" : Timestamp(1655448393, 2) }
{ "_id" : 3, "datetime" : Timestamp(1655448393, 3) }
{ "_id" : 4, "datetime" : Timestamp(1655448393, 4) }
{ "_id" : 5, "datetime" : Timestamp(1655448393, 5) }
datetime
フィールドのタイプを確認してください。
// MongoDB 5.0.8
> typeof db.collection3.findOne().datetime;
出力:
object
今回は、次のソリューションを使用してタイムスタンプを日付に変換し、日付ごとにエントリをカウントできます。
サンプルコード(collection3
用):
// MongoDB 5.0.8
> db.collection3.aggregate([
{
"$project": { "_id": "$datetime" }
},
{
"$group": {
"_id": { "$dateToString": { "format": "%Y-%m-%d", "date": "$_id" } },
"count": { "$sum": 1 }
}
}
]);
出力:
{ "_id" : "2022-06-17", "count" : 5 }