在 MongoDB 中將時間戳轉換為日期

Mehvish Ashiq 2023年1月30日 2022年7月12日
  1. 在 MongoDB 中將時間戳轉換為日期
  2. 當時間戳為數字型別時,將時間戳轉換為日期
  3. 當時間戳為字串型別時,將時間戳轉換為日期
  4. 當時間戳為物件型別時,將時間戳轉換為日期
在 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 採用 timestampdateObjectId,根據使用者指定的格式進行進一步轉換,而 $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 }

此程式碼與前面的示例相同,但有一點不同。在這裡,我們首先使用 $toLongdatetime 欄位從字串型別轉換為數字型別,然後使用轉換後的值使用 $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 }
Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook