MongoDB
 Computer >> コンピューター >  >> プログラミング >> MongoDB

MongoDBで日付を条件にクエリを返す方法を徹底解説

MongoDBでは、ISODate型として保存された日付フィールドを条件に指定することで、特定の期間や時刻に基づいたドキュメントを簡単に検索できます。本記事では、サンプルコードを交えながら、日付ベースのクエリの基本的な使い方を解説します。

1. サンプルコレクションの作成

まずは理解を深めるために、乗客情報を含むドキュメントを持つコレクションを作成しましょう。以下のクエリでコレクションにドキュメントを挿入します。

> db.returnQueryFromDate.insertOne({"PassengerName":"John","PassengerAge":23,"PassengerArrivalTime":new ISODate("2018-03-10 14:45:56")});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c8a57be9064dcd4a68b70e4")
}
> db.returnQueryFromDate.insertOne({"PassengerName":"Larry","PassengerAge":21,"PassengerArrivalTime":new ISODate("2018-05-19 11:10:23")});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c8a57bf9064dcd4a68b70e5")
}
> db.returnQueryFromDate.insertOne({"PassengerName":"Mike","PassengerAge":24,"PassengerArrivalTime":new ISODate("2018-08-25 16:40:12")});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c8a57bf9064dcd4a68b70e6")
}
> db.returnQueryFromDate.insertOne({"PassengerName":"Carol","PassengerAge":26,"PassengerArrivalTime":new ISODate("2019-01-29 09:45:10")});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c8a57bf9064dcd4a68b70e7")
}

各ドキュメントには、乗客名(PassengerName)、年齢(PassengerAge)、到着時刻(PassengerArrivalTime)が格納されています。日付フィールドには new ISODate() を使って日時を設定しています。

2. find()メソッドですべてのドキュメントを表示

コレクション内のすべてのドキュメントを確認するには、find() メソッドを使用します。整形して表示するために pretty() を付けて実行しましょう。

> db.returnQueryFromDate.find().pretty();

実行結果は以下の通りです。

{
    "_id" : ObjectId("5c8a57be9064dcd4a68b70e4"),
    "PassengerName" : "John",
    "PassengerAge" : 23,
    "PassengerArrivalTime" : ISODate("2018-03-10T14:45:56Z")
}
{
    "_id" : ObjectId("5c8a57bf9064dcd4a68b70e5"),
    "PassengerName" : "Larry",
    "PassengerAge" : 21,
    "PassengerArrivalTime" : ISODate("2018-05-19T11:10:23Z")
}
{
    "_id" : ObjectId("5c8a57bf9064dcd4a68b70e6"),
    "PassengerName" : "Mike",
    "PassengerAge" : 24,
    "PassengerArrivalTime" : ISODate("2018-08-25T16:40:12Z")
}
{
    "_id" : ObjectId("5c8a57bf9064dcd4a68b70e7"),
    "PassengerName" : "Carol",
    "PassengerAge" : 26,
    "PassengerArrivalTime" : ISODate("2019-01-29T09:45:10Z")
}

3. 日付を条件にしたクエリの実行

ここからが本題です。日付を条件にドキュメントを絞り込むには、比較演算子を使います。以下の例では、「2018-05-19T11:10:23Z」以降の日付を持つレコードのみを表示しています。

> db.returnQueryFromDate.find({"PassengerArrivalTime" : { $gte : new ISODate("2018-05-19T11:10:23Z") }}).pretty();

実行結果は以下の通りです。

{
    "_id" : ObjectId("5c8a57bf9064dcd4a68b70e5"),
    "PassengerName" : "Larry",
    "PassengerAge" : 21,
    "PassengerArrivalTime" : ISODate("2018-05-19T11:10:23Z")
}
{
    "_id" : ObjectId("5c8a57bf9064dcd4a68b70e6"),
    "PassengerName" : "Mike",
    "PassengerAge" : 24,
    "PassengerArrivalTime" : ISODate("2018-08-25T16:40:12Z")
}
{
    "_id" : ObjectId("5c8a57bf9064dcd4a68b70e7"),
    "PassengerName" : "Carol",
    "PassengerAge" : 26,
    "PassengerArrivalTime" : ISODate("2019-01-29T09:45:10Z")
}

ご覧のとおり、指定した日時以前の「John」のレコードは除外され、条件を満たす3件のドキュメントだけが返されました。

4. その他の便利な日付比較演算子

日付検索では、$gte 以外にも以下の比較演算子が活用できます。

  • $gt:指定した日付より(一致する日時は含まない)
  • $lte:指定した日付以前(一致する日時を含む)
  • $lt:指定した日付より(一致する日時は含まない)
  • $eq:指定した日付と完全に一致

例えば、2018年のデータだけを抽出したい場合は、以下のように $gte$lt を組み合わせます。

> db.returnQueryFromDate.find({
    "PassengerArrivalTime" : {
        $gte : new ISODate("2018-01-01T00:00:00Z"),
        $lt : new ISODate("2019-01-01T00:00:00Z")
    }
}).pretty();

まとめ

MongoDBで日付ベースのクエリを実行するには、日付フィールドを ISODate型 で保存し、find() メソッドと比較演算子($gte$lt など)を組み合わせるのが基本です。範囲検索を活用すれば、特定の期間のデータ抽出も簡単に行えます。ログ分析や期間集計など、実務でも頻繁に使うテクニックなので、ぜひマスターしておきましょう。

  1. 【MongoDB】日付範囲内のレコードを取得するクエリの書き方

    MongoDBで特定の日付範囲内のレコードを取得するには、比較演算子「$gt」(より大きい)と「$lt」(より小さい)を組み合わせて使用します。この記事では、実際のコード例を通じて、日付範囲検索の基本的な方法をわかりやすく解説します。1. サンプルコレクションの作成まずは、日付フィールドを持つドキュメントを挿入して、テスト用のコレクションを作成しましょう。> db.demo60.insertOne({"ArrivalDate":new ISODate("2019-01-11 12:30:10")}); {    &nb

  2. MongoDBで$dateToStringを使って特定の日付形式でクエリ結果をフィルタリングする方法

    MongoDBで特定の日付形式に基づいてクエリ結果をフィルタリングしたい場合は、集計パイプラインの $dateToString 演算子を使用します。この演算子を使うと、Date型のフィールドを任意の文字列形式(例:YYYY-MM-DD)に変換し、その文字列と比較することで絞り込みが可能になります。まずは、サンプル用のコレクションにドキュメントを作成してみましょう。> db.demo433.insertOne({"DueDate":new Date("2019-11-23")}); {    "acknowledged&