MongoDB に日付と時刻を保存する

Tahseen Tauseef 2024年2月15日
  1. Date() メソッドを使用して MongoDB に日付と時刻を格納する
  2. ISODate() を使用して MongoDB に日付と時刻を保存する
  3. まとめ
MongoDB に日付と時刻を保存する

この記事では、日付と時刻を保存する最良の方法について説明します。 Date()メソッドについて詳しく説明します。

さらに、日付クエリを使用するさまざまな方法について説明します。 MongoDB で ISODate が機能しない場合の日付クエリの問題についても、コード セグメントの説明とともに説明します。

Date() メソッドを使用して MongoDB に日付と時刻を格納する

Date() は、現在の日付を文字列または Date オブジェクトとして出力します。

new Date() は、現在の日付で Date オブジェクトを返します。 ISODate ヘルパーは、mongosh によってこのオブジェクトにラップされます。 ISODate は UTC (世界時) です。

new Date() 関数 Object() { [ネイティブ コード] } または ISODate() メソッドを使用して、年が 0 から 9999 の ISO-8601 日付文字列を指定することにより、特定の日付を定義できます。 これらの関数は、次の形式を受け入れます。

  1. 指定された日付の ISODate は new Date("") によって返されます。
  2. new Date("") は、クライアントのローカル タイム ゾーンで DateTime を指定し、UTC でその DateTime を使用して ISODate を返します。
  3. new Date(<integer>) は、UNIX エポック (1970 年 1 月 1 日) からのミリ秒単位で指定された DateTime を持つ ISODate インスタンスを返します。

MongoDB での Date() メソッドの動作

Date オブジェクトは、Unix エポックからのミリ秒を表す符号付き 64 ビット整数として内部的に保持されます。

すべてのデータベース プロシージャとドライバが完全な 64 ビット範囲をサポートしているわけではありません。 0 から 9999 までの範囲の年を含む日付は、安全に処理できます。

Date() メソッドの例

クエリで Date() を使用する

次のコードは、products コレクションに _id が 1 に等しいドキュメントが存在しない場合、フィールド dateAdded が現在の日付に設定されたドキュメントを追加します。

db.products.updateOne(
    { _id: 1 },
    {
        $set: { item: "apple" },
        $setOnInsert: { dateAdded: new Date() }
    },
    { upsert: true }
)

日付を文字列として返す

次の例に示すように、Date() メソッドを使用して、日付を文字列として返します。

var myDateString = Date();

日付を Date オブジェクトとして返す

Mongosh は日付型のオブジェクトを ISODate ヘルパーでラップします。 ただし、オブジェクトは日付型のままです。

次の例では、new Date() を使用して、指定された UTC DateTime を持つ Date オブジェクトを返します。

var myDate = new Date("2016-05-18T16:00:00Z");

MongoDB 日付順

この問題は、MongoDB の sort() 関数と $sort 集約を使用して解決できます。 このツールを使用して、データを昇順または降順で並べ替えることができます。

例:

db.posts.find().pretty()
{
    "_id" : 1,
    "title" : "MongoDB",
    "body" : "Hi there",
    "date" : "2021-01-01T00:00:00.000Z",
        "Country" : "United Kingdom"
}
{
    "_id" : 2,
    "title" : "MySQL",
    "body" : "Hello",
    "date" : ISODate("2020-01-01T00:00:00Z"),
        "Country" : "United States of America"
}
{
    "_id" : 3,
    "title" : "SQL",
    "body" : "World",
    "date" : ISODate("2021-01-01T00:00:00Z"),
        "Country" : "New Zealand"
}

一部のデータは投稿コレクションに追加され、日付フィールドはそれらを昇順で並べ替え、古い日付が最初に表示されるようにします。

db.posts.find().sort({ date: 1 }).pretty()
{
    "_id" : 1,
    "title" : "MongoDB",
    "body" : "Hi there",
    "date" : "2021-01-01T00:00:00.000Z",
        "Country" : "United Kingdom"
}
{
    "_id" : 2,
    "title" : "MySQL",
    "body" : "Hello",
    "date" : ISODate("2020-01-01T00:00:00Z"),
        "Country" : "United States of America"
}
{
    "_id" : 3,
    "title" : "SQL",
    "body" : "World",
    "date" : ISODate("2021-01-01T00:00:00Z"),
        "Country" : "New Zealand"
}

最初のドキュメントには date オブジェクトではなく日付文字列があるため、ドキュメント 2 の日付の方が後であっても、日付文字列が最初に表示されます。

MongoDB の日付による並べ替えが機能しない

MongoDB が機能しない理由はいくつか考えられますが、MongoDB で日付順に並べ替えるには、いくつかの手順を覚えておく必要があります。

  1. コレクションにデータを保存していることを常に覚えておいてください。
  2. ドキュメント内に date フィールドを保存するには、Date()ISODate() の 2つの方法があります。
  3. sort() メソッドを使用して date フィールドをソートする場合、使用したデータ型を確認します。

例:

db.document.insertOne({ "productId" : 1001, "productDeliveryDateTime": new Date() });
{
        "acknowledged" : true,
        "insertedId" : ObjectId("611c9e39e1fdc428cf238802")
}

この例では Date() 文字列を使用して日付が追加され、コレクション名はドキュメントです。 同様に、ISODate() を使用してドキュメントに日付を挿入することもできます。

ISODate() を使用して MongoDB に日付と時刻を保存する

$gte 演算子と ISODate() を使用して、MongoDB で ISODate を使用した日付クエリを実装します。

これをよりよく理解するために、ドキュメントを使用してコレクションを作成しましょう。 以下は、ドキュメントを使用してコレクションを構築するクエリです。

> db.dateDemo.insertOne({"StudentName":"John","StudentAge":26,"AdmissionDate":new ISODate("2013-06-07")});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c8a65799064dcd4a68b70ea")
}

find() 関数は、コレクション内のすべてのドキュメントを表示できます。

クエリ:

db.dateDemo.find().pretty();

出力:

日付クエリ

ISODate() を使用した日付クエリ:

> db.dateDemo.find({"AdmissionDate":{"$gte": ISODate("2013-06-07T00:00:00Z")}}).pretty();

出力:

日付クエリ 1

まとめ

この記事では、Date() メソッドについて簡単に説明しました。 その後、Date() メソッドによるコレクションのソートの問題点が指摘されています。

MongoDB の ISODate で日付クエリがどのように機能するかを例で説明します。 また、これは、MongoDB に日付と時刻を保存するための最適な形式は、ネイティブの JavaScript Date() または ISODate() 形式を使用することであり、内部的に BSON ネイティブ Date オブジェクトに変換することを示しています。