HOWTO · MongoDB
MongoDB に日付と時刻を保存する
MongoDB での日付の保存方法を解説します。Date() は文字列を返し、new Date() は日付値を作成します。日付フィールドの保存、クエリ、並べ替えの例と確認方法も紹介します。
このページの内容
MongoDB に日付を保存するには、通常 new Date() で作成した JavaScript の Date 値を渡します。mongosh で new を付けずに Date() を呼び出すと文字列が返り、ドキュメントに保存する日付値にはなりません。このガイドでは両者の違い、ISODate() を使った日付範囲クエリ、時系列での並べ替えとトラブルシューティングを説明します。
MongoDB で Date() と new Date() を使う
Date() は現在の日付と時刻を文字列として返します。MongoDB が BSON Date として保存できる JavaScript の Date 値が必要な場合は、new Date() を使います。特定の時点を指定するには、Z などの UTC を明示する記号を付けた ISO 8601 タイムスタンプを渡します。
次の例を実行します。
このセクションのコードと表示されるラベルや出力は英語のままです。
console.log(new Date("2024-06-01T12:00:00Z").toISOString());
2024-06-01T12:00:00.000Z
この JavaScript の例は日付値の作成だけを示しています。MongoDB の操作には mongosh セッションが必要です。挿入や更新では、たとえば db.products.insertOne({ item: "apple", dateAdded: new Date() }) のように値を直接使います。ドキュメントの dateAdded に保存されるのは BSON Date 値であり、Date() が返す文字列ではありません。
MongoDB で日付をクエリし、並べ替える
日付フィールドは sort() を使ってどちらの方向にも並べ替えられます。昇順(古い日付から)には 1、降順(新しい日付から)には -1 を指定します。たとえば、db.posts.find().sort({ date: 1 }) は posts の date フィールドを古い順に並べ替え、db.posts.find().sort({ date: -1 }) は逆順に返します。これらのクエリは、フィールド値が一貫して日付として保存されていることを前提とします。
ISO 8601 形式に見える文字列も、型は文字列のままです。フィールドに文字列と BSON Date 値が混在すると、MongoDB はまず BSON の型順に並べ、その後、各型の値順に並べます。そのため、すべてのドキュメントを通して時系列順になるとは限りません。日付を確実に並べ替えるには、フィールド値を BSON Date に統一し、クエリでも同じフィールド名と並べ替え方向を使います。
結果が想定した順序にならない場合は、クエリの対象コレクションが正しいか、並べ替えキーが保存済みフィールド名と一致するか、値の BSON Date 型が統一されているか、方向に 1 または -1 を意図どおり指定しているかを確認してください。コレクションにはドキュメントが含まれ、ドキュメントには日付フィールドが含まれます。
MongoDB の日付クエリで ISODate() を使う
ISODate() は mongosh のシェル例で日付値を表すためのヘルパーであり、独立した BSON 型ではありません。クエリで日付の範囲を指定するときに使います。次の例は、AdmissionDate が 2013 年 6 月 7 日の UTC 午前 0 時(開始を含む)から、6 月 8 日の UTC 午前 0 時(終了を含まない)までにあるドキュメントを検索します。
db.students.find({ AdmissionDate: { $gte: ISODate("2013-06-07T00:00:00Z"), $lt: ISODate("2013-06-08T00:00:00Z") } })
$gte は開始時点を含み、$lt は終了時点を含みません。そのため、隣り合う日ごとの範囲で同じ時点が重複して含まれることはありません。クエリのフィールド名は、BSON Date として保存されたフィールド名と一致させてください。
これらの mongosh スニペットは説明用であり、実行結果を示すものではありません。名前が指定されたコレクションとフィールドを含むデータベースに接続した MongoDB シェルで実行してください。find() の結果はそのデータに応じて変わります。
まとめ
日付値を保存するには new Date() を使い、Date() は文字列を返すことを覚えておきましょう。mongosh では ISODate() で日付範囲を指定してクエリし、型が統一された BSON Date 値を sort() で並べ替えます。並べ替え結果が想定と異なる場合は、フィールド名、BSON 型、並べ替え方向を確認してください。