MongoDBで現在日時(NOW)より前の日時値をクエリする方法
MongoDBで「現在日時(NOW)より前」の日時データを抽出したい場合は、$lte(以下)演算子とnew Date()を組み合わせて使用することで簡単に実現できます。
この記事では、実際にサンプルコレクションを作成し、現在日時より前のArrivalDateを持つドキュメントを取得するまでの手順を順番に解説していきます。
サンプルコレクションの作成
まずは、日時フィールドを含むドキュメントを挿入してコレクションを作成しましょう。insertOne()メソッドを使って、4件の顧客データを登録します。
>db.dateTimeValueLessThanNowDemo.insertOne({"CustomerName":"Larry","CustomerProductName":"Product-1","ArrivalDate":new ISODate("2017-01-31")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ca1e8ab66324ffac2a7dc59")
}
>db.dateTimeValueLessThanNowDemo.insertOne({"CustomerName":"Mike","CustomerProductName":"Product-2","ArrivalDate":new ISODate("2019-04-01")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ca1e8c166324ffac2a7dc5a")
}
>db.dateTimeValueLessThanNowDemo.insertOne({"CustomerName":"Chris","CustomerProductName":"Product-3","ArrivalDate":new ISODate("2019-03-31")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ca1e8d266324ffac2a7dc5b")
}
>db.dateTimeValueLessThanNowDemo.insertOne({"CustomerName":"Robert","CustomerProductName":"Product-4","ArrivalDate":new ISODate("2019-04-02")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ca1e8e766324ffac2a7dc5c")
}
登録したドキュメントの確認
find()メソッドにpretty()を組み合わせると、コレクション内のすべてのドキュメントを見やすい整形された形式で表示できます。
> db.dateTimeValueLessThanNowDemo.find().pretty();
このクエリを実行すると、以下のような出力が得られます。
{
"_id" : ObjectId("5ca1e8c166324ffac2a7dc5a"),
"CustomerName" : "Mike",
"CustomerProductName" : "Product-2",
"ArrivalDate" : ISODate("2019-04-01T00:00:00Z")
}
{
"_id" : ObjectId("5ca1e8d266324ffac2a7dc5b"),
"CustomerName" : "Chris",
"CustomerProductName" : "Product-3",
"ArrivalDate" : ISODate("2019-03-31T00:00:00Z")
}
{
"_id" : ObjectId("5ca1e8e766324ffac2a7dc5c"),
"CustomerName" : "Robert",
"CustomerProductName" : "Product-4",
"ArrivalDate" : ISODate("2019-04-02T00:00:00Z")
}
現在日時より前の日時値をクエリする
それでは本題です。現在日時以前の日時値を持つドキュメントを検索するには、$lte演算子の値としてnew Date()を指定します。たとえば、現在の日付が2019-04-02であると仮定してみましょう。
> db.dateTimeValueLessThanNowDemo.find({ ArrivalDate: { $lte: new Date() } }).pretty();
このクエリを実行すると、現在日時より前(または同じ日時)のArrivalDateを持つ3件のドキュメントのみが返されます。2019-04-02のRobertのデータは、現在日時より後の時刻であるため結果に含まれません。
{
"_id" : ObjectId("5ca1e8ab66324ffac2a7dc59"),
"CustomerName" : "Larry",
"CustomerProductName" : "Product-1",
"ArrivalDate" : ISODate("2017-01-31T00:00:00Z")
}
{
"_id" : ObjectId("5ca1e8c166324ffac2a7dc5a"),
"CustomerName" : "Mike",
"CustomerProductName" : "Product-2",
"ArrivalDate" : ISODate("2019-04-01T00:00:00Z")
}
{
"_id" : ObjectId("5ca1e8d266324ffac2a7dc5b"),
"CustomerName" : "Chris",
"CustomerProductName" : "Product-3",
"ArrivalDate" : ISODate("2019-03-31T00:00:00Z")
}
ポイントのまとめ
- $lte:指定した値「以下」を意味する比較演算子です。等しい日時も結果に含まれます。厳密に「より前」だけを取得したい場合は、代わりに$ltを使用してください。
- new Date():クエリ実行時点の現在日時を返します。そのため、このクエリは実行するたびに常に最新の時刻との比較を行います。
- 日時の比較はISODate形式で保存されたBSON Date型同士で行われるため、文字列として日付を保存している場合とは挙動が異なる点に注意しましょう。
-
MongoDBで配列をクエリして特定の値を取得する方法
配列から特定の値を取得するには、aggregate()メソッドと$projectステージを組み合わせて使用します。まずは、ドキュメントを含むコレクションを作成してみましょう。 > db.demo761.insertOne( ... { ... "details": [ ... { ... "
-
【MySQL】DATETIME型のデフォルト値としてNOW()(現在日時)を設定する方法
MySQLでDATETIME型のデフォルト値として現在日時を設定する方法 MySQLでは、動的デフォルト(dynamic default)を活用することで、NOW()関数が返す現在の日時を列のデフォルト値として設定できます。DATETIME型の列に対しては「DEFAULT CURRENT_TIMESTAMP」を指定するのが一般的ですが、MySQL 8.0.13以降であれば「DEFAULT (NOW())」のように式形式でデフォルト値を定義することも可能です。 以下では、まずDATETIME型の列を持つテーブルを作成し、続いて「MyTime」列のデフォルト値として現在日時が自動的に登録される流れ