MongoDB でタイムスタンプを日付に変換する

Mehvish Ashiq 2023年1月30日
  1. MongoDB でタイムスタンプを日付に変換する
  2. タイムスタンプがタイプ番号の場合、タイムスタンプを日付に変換する
  3. タイムスタンプが文字列型の場合、タイムスタンプを日付に変換する
  4. タイムスタンプがオブジェクト型の場合、タイムスタンプを日付に変換する
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 フィールドに保存します。このフィールドは、ドキュメントのグループ化にさらに使用されます。

$dateToStringtimestampdate、または 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 }
著者: Mehvish Ashiq
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

関連記事 - MongoDB Date