MongoDB に日付と時刻を保存する
この記事では、日付と時刻を保存する最良の方法について説明します。 Date()
メソッドについて詳しく説明します。
さらに、日付クエリを使用するさまざまな方法について説明します。 MongoDB で ISODate が機能しない場合の日付クエリの問題についても、コード セグメントの説明とともに説明します。
Date()
メソッドを使用して MongoDB に日付と時刻を格納する
Date() は、現在の日付を文字列または Date オブジェクトとして出力します。
new Date()
は、現在の日付で Date
オブジェクトを返します。 ISODate ヘルパーは、mongosh によってこのオブジェクトにラップされます。 ISODate は UTC (世界時) です。
new Date()
関数 Object() { [ネイティブ コード] }
または ISODate()
メソッドを使用して、年が 0 から 9999 の ISO-8601 日付文字列を指定することにより、特定の日付を定義できます。 これらの関数は、次の形式を受け入れます。
- 指定された日付の ISODate は
new Date("")
によって返されます。 new Date("")
は、クライアントのローカル タイム ゾーンで DateTime を指定し、UTC でその DateTime を使用して ISODate を返します。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 で日付順に並べ替えるには、いくつかの手順を覚えておく必要があります。
- コレクションにデータを保存していることを常に覚えておいてください。
- ドキュメント内に
date
フィールドを保存するには、Date()
とISODate()
の 2つの方法があります。 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();
出力:
まとめ
この記事では、Date()
メソッドについて簡単に説明しました。 その後、Date()
メソッドによるコレクションのソートの問題点が指摘されています。
MongoDB の ISODate で日付クエリがどのように機能するかを例で説明します。 また、これは、MongoDB に日付と時刻を保存するための最適な形式は、ネイティブの JavaScript Date()
または ISODate()
形式を使用することであり、内部的に BSON ネイティブ Date
オブジェクトに変換することを示しています。