MongoDBの$matchを使って日付条件でドキュメントを抽出する方法
MongoDBの$matchで日付を一致させる方法
MongoDBで特定の日付条件に一致するドキュメントを抽出したい場合は、集計(aggregation)フレームワークの$matchステージを使用します。$matchは、指定した条件に合致するドキュメントだけを次のパイプラインステージへ渡すフィルターの役割を果たします。
この記事では、実際にコレクションを作成し、$matchを使って日付条件でデータを絞り込む手順を解説します。
1. サンプルコレクションの作成
まず、ShippingDate(出荷日)フィールドを持つドキュメントをいくつか作成しましょう。
> db.demo491.insertOne({"ShippingDate":new ISODate("2020-01-10")});{
"acknowledged" : true,
"insertedId" : ObjectId("5e849a09b0f3fa88e22790be")
}
> db.demo491.insertOne({"ShippingDate":new ISODate("2020-02-21")});{
"acknowledged" : true,
"insertedId" : ObjectId("5e849a0eb0f3fa88e22790bf")
}
> db.demo491.insertOne({"ShippingDate":new ISODate("2020-03-23")});{
"acknowledged" : true,
"insertedId" : ObjectId("5e849a1db0f3fa88e22790c0")
}
> db.demo491.insertOne({"ShippingDate":new ISODate()});{
"acknowledged" : true,
"insertedId" : ObjectId("5e849a28b0f3fa88e22790c1")
}ここで注意すべき点は、日付を文字列ではなくISODate()で保存していることです。BSON型としての日付を保存することで、後から正確な範囲比較が可能になります。
2. 登録されたドキュメントの確認
find()メソッドを使って、コレクション内のすべてのドキュメントを表示します。
> db.demo491.find();
実行すると、以下のような出力が得られます。
{ "_id" : ObjectId("5e849a09b0f3fa88e22790be"), "ShippingDate" : ISODate("2020-01-
10T00:00:00Z") }
{ "_id" : ObjectId("5e849a0eb0f3fa88e22790bf"), "ShippingDate" : ISODate("2020-02-
21T00:00:00Z") }
{ "_id" : ObjectId("5e849a1db0f3fa88e22790c0"), "ShippingDate" : ISODate("2020-03-
23T00:00:00Z") }
{ "_id" : ObjectId("5e849a28b0f3fa88e22790c1"), "ShippingDate" : ISODate("2020-04-
01T13:42:00.090Z") }4件のドキュメントが登録されていることが確認できます。最後の1件はnew ISODate()によって現在日時が自動的に設定されています。
3. $matchを使った日付の一致クエリ
それでは、$matchステージを使って特定の日時以降のドキュメントを抽出してみましょう。以下のクエリでは、$gte演算子(以上を意味する比較演算子)と組み合わせて、「2020年2月24日18時10分11秒」以降のShippingDateを持つドキュメントだけを取得しています。
> db.demo491.aggregate([
... {
... '$match' : { 'ShippingDate' : { '$gte' : ISODate('2020-02-24T18:10:11.000Z') } }
... }
... ]);実行結果は以下の通りです。
{ "_id" : ObjectId("5e849a1db0f3fa88e22790c0"), "ShippingDate" : ISODate("2020-03-
23T00:00:00Z") }
{ "_id" : ObjectId("5e849a28b0f3fa88e22790c1"), "ShippingDate" : ISODate("2020-04-
01T13:42:00.090Z") }ポイントまとめ
- $matchはaggregate()のパイプライン内で使用し、条件に一致するドキュメントのみを抽出できる
- 日付の比較には必ずISODate()を使い、文字列として保存しないこと
- $gte(以上)、$lte(以下)、$gt(より大きい)、$lt(より小さい)などの比較演算子を組み合わせることで、柔軟な期間検索が可能
このように、$matchと比較演算子を組み合わせれば、特定の日付や期間でドキュメントを効率的に絞り込むことができます。ログ分析や売上データの期間集計など、実務でも頻繁に使われるテクニックなので、ぜひマスターしておきましょう。
-
MongoDBで配列フィールドに対して$allを使って全要素に一致させる方法
配列フィールドの全要素に一致させるには MongoDBで配列内のすべての指定要素を含むドキュメントを検索したい場合には、$all 演算子を使用します。$all は、対象フィールドの値が配列であり、その配列が指定した要素をすべて含んでいるドキュメントだけを選択するクエリ演算子です。 ここでは、サンプルコレクションを作成し、実際に $all を使った検索手順を順番に見ていきましょう。 1. コレクションへのドキュメント登録 まずは insertOne() メソッドを使って、サンプルコレクション「demo695」にドキュメントを挿入します。 > db.demo695.insertOne({L
-
MongoDBで生年月日を年齢に変換する方法
MongoDBでは、集計パイプライン(aggregate)を活用することで、保存されている生年月日(DateOfBirth)のデータから現在の年齢を簡単に算出できます。この記事では、実際のコード例を使いながらその手順をわかりやすく解説します。1. コレクションにドキュメントを挿入するまずは、生年月日を含むドキュメントを持つコレクションを作成します。以下のように insertOne() メソッドを使用します。> db.demo754.insertOne({DateOfBirth:new Date(2000-05-03)}); { acknowledged : true, ins