在 MongoDB 中將時間戳轉換為日期
本教程演示瞭如何在 MongoDB 中將時間戳轉換為日期。它還說明了如何計算特定日期的條目。
在 MongoDB 中將時間戳轉換為日期
從 timestamp 轉換為日期取決於我們儲存時間戳的型別。它是物件、數字還是字串型別?
我們可以在 mongo shell 上使用以下命令檢查欄位的型別。在本教程中,我們將學習如何將時間戳轉換為數字、字串或物件型別的日期。
檢查欄位型別:
// 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 }
在這裡,我們使用 $project
聚合階段,它從指定集合中獲取文件並告知欄位的包含、_id
欄位的抑制、新欄位的新增以及重置現有欄位的值。
在 $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 }
此程式碼與前面的示例相同,但有一點不同。在這裡,我們首先使用 $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 }