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

MongoDBで月と日だけを条件にデータを検索する方法(アグリゲーション活用)

MongoDBで月と日のみを検索するには

年に関係なく、特定の「月」と「日」だけを条件にドキュメントを検索したい場合には、アグリゲーションフレームワーク(aggregate)を使用するのが効果的です。$month 演算子と $dayOfMonth 演算子を使うことで、日付フィールドから月と日の値を取り出し、それらを一致条件として絞り込むことができます。

まずは、サンプルとなるコレクションにドキュメントを挿入してみましょう。

> db.monthAndDayDemo.insertOne({"LoginDate":new ISODate("2019-04-27")});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cefbcaeef71edecf6a1f6b2")
}
> db.monthAndDayDemo.insertOne({"LoginDate":new ISODate("2018-04-30")});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cefbcb7ef71edecf6a1f6b3")
}
> db.monthAndDayDemo.insertOne({"LoginDate":new ISODate("2018-04-27")});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cefbcbcef71edecf6a1f6b4")
}
> db.monthAndDayDemo.insertOne({"LoginDate":new ISODate("2016-04-27")});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cefbdaaef71edecf6a1f6b5")
}

find() メソッドを使って、コレクション内のすべてのドキュメントを表示して確認します。

> db.monthAndDayDemo.find();

出力結果

{ "_id" : ObjectId("5cefbcaeef71edecf6a1f6b2"), "LoginDate" : ISODate("2019-04-27T00:00:00Z") }
{ "_id" : ObjectId("5cefbcb7ef71edecf6a1f6b3"), "LoginDate" : ISODate("2018-04-30T00:00:00Z") }
{ "_id" : ObjectId("5cefbcbcef71edecf6a1f6b4"), "LoginDate" : ISODate("2018-04-27T00:00:00Z") }
{ "_id" : ObjectId("5cefbdaaef71edecf6a1f6b5"), "LoginDate" : ISODate("2016-04-27T00:00:00Z") }

4件のドキュメントが登録されていることが確認できました。この中から「毎年4月27日」に該当するデータだけを、年を問わず抽出してみます。

以下が、月と日のみを条件に検索するためのクエリです。

> db.monthAndDayDemo.aggregate(
   { "$project": {
         "m": { "$month": "$LoginDate" },
         "d": { "$dayOfMonth": "$LoginDate" }
      }
   },
   { "$match": { "m": 4, "d": 27 } }
);

クエリの仕組み

このパイプラインは2つのステージで構成されています。

$project ステージ: LoginDate フィールドに対して $month 演算子を適用して月の数値を「m」として、$dayOfMonth 演算子を適用して日の数値を「d」としてそれぞれ新しいフィールドに展開します。
$match ステージ: 展開された「m」(月)が4、「d」(日)が27に一致するドキュメントのみをフィルタリングします。

出力結果

{ "_id" : ObjectId("5cefbcaeef71edecf6a1f6b2"), "m" : 4, "d" : 27 }
{ "_id" : ObjectId("5cefbcbcef71edecf6a1f6b4"), "m" : 4, "d" : 27 }
{ "_id" : ObjectId("5cefbdaaef71edecf6a1f6b5"), "m" : 4, "d" : 27 }

実行結果を見ると、2019年・2018年・2016年の「4月27日」の3件が正しく抽出されており、年が異なっていても月と日が一致するドキュメントだけを取得できていることがわかります。誕生日や記念日など「日付そのものより月日が重要」なデータを扱う際に、この手法は非常に便利です。

  1. MySQLで日付フィールドの日と月だけを比較する方法

    MySQLでは、DATE_FORMAT()関数を活用することで、日付フィールドの「日」と「月」だけを比較できます。年を無視して誕生日や記念日などの同じ月日を検索したい場合に非常に便利なテクニックです。基本構文日と月のみを比較するための基本的な構文は以下のとおりです。select *from yourTableName WHERE DATE_FORMAT(yourColumnName, %m-%d) = DATE_FORMAT(yourValue, %m-%d) and yourCondition;DATE_FORMAT()の書式指定子「%m」は月、「%d」は日を表します。両辺を「月-日」の形式

  2. MySQLのORDER BY CASEを使って現在日を基準に月日順にレコードを並べ替える方法

    MySQLで日付データを「今日以降の日付が先、過去の日付が後」というルールで並べ替えたい場合、ORDER BY句とCASE式を組み合わせることで簡単に実現できます。本記事では、実際のSQL例を交えながらその手順をわかりやすく解説します。 サンプルテーブルの作成 まずは練習用のテーブルを作成しましょう。ここでは日付型のカラムを1つだけ持つシンプルなテーブルを用意します。 mysql> create table DemoTable (     DueDate date ); Query OK, 0 rows affected (0.56 sec) 注