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

MongoDBで特定の月・年(日付を除く)を抽出するクエリの書き方

MongoDBの日付フィールドから「特定の月」や「特定の年」だけを抽出したい場合(日そのものは問わないケース)、アグリゲーションフレームワークの $month 演算子や $year 演算子を活用するのが最も効果的です。この記事では、実際のコード例を交えながら、具体的な手順をわかりやすく解説します。

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

まず、動作確認用として、学生の名前と生年月日を含むドキュメントを格納したコレクションを作成しましょう。insertOne() メソッドを使って、3件のドキュメントを順番に挿入します。

> db.specificMonthDemo.insertOne({"StudentName":"Larry","StudentDateOfBirth":new ISODate('1995-01-12')});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cb9a9ca8f1d1b97daf71819")
}
> db.specificMonthDemo.insertOne({"StudentName":"Chris","StudentDateOfBirth":new ISODate('1999-12-31')});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cb9a9db8f1d1b97daf7181a")
}
> db.specificMonthDemo.insertOne({"StudentName":"David","StudentDateOfBirth":new ISODate('2000-06-01')});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cb9a9ee8f1d1b97daf7181b")
}

登録済みドキュメントの確認

続いて、find() メソッドを使って、コレクション内のすべてのドキュメントを表示し、データが正しく登録されているかを確認します。

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

実行すると、以下のように挿入した3件のドキュメントが出力されます。

{
    "_id" : ObjectId("5cb9a9ca8f1d1b97daf71819"),
    "StudentName" : "Larry",
    "StudentDateOfBirth" : ISODate("1995-01-12T00:00:00Z")
}
{
    "_id" : ObjectId("5cb9a9db8f1d1b97daf7181a"),
    "StudentName" : "Chris",
    "StudentDateOfBirth" : ISODate("1999-12-31T00:00:00Z")
}
{
    "_id" : ObjectId("5cb9a9ee8f1d1b97daf7181b"),
    "StudentName" : "David",
    "StudentDateOfBirth" : ISODate("2000-06-01T00:00:00Z")
}

特定の月を抽出するアグリゲーションクエリ

ここからが本題です。日付全体ではなく「月」だけを条件にドキュメントを絞り込むには、$project ステージで $month 演算子により月の数値を取り出し、続く $match ステージで目的の月と一致するドキュメントをフィルタリングします。

以下の例では、「1月生まれの学生」を抽出しています。

> db.specificMonthDemo.aggregate([ {$project: {StudentName: 1, StudentDateOfBirth:
    {$month: '$StudentDateOfBirth'}}}, {$match: {StudentDateOfBirth: 01}} ]).pretty();

実行結果は次のとおりです。生年月日が1月であるLarryのドキュメントのみが返され、StudentDateOfBirth フィールドには月を表す数値「1」が出力されていることがわかります。

{
    "_id" : ObjectId("5cb9a9ca8f1d1b97daf71819"),
    "StudentName" : "Larry",
    "StudentDateOfBirth" : 1
}

特定の年で絞り込みたい場合

同様の手法で「年」による絞り込みも可能です。$month の代わりに $year 演算子を使用すれば、日付を無視して該当する年のドキュメントだけを取得できます。

> db.specificMonthDemo.aggregate([ {$project: {StudentName: 1, StudentDateOfBirth:
    {$year: '$StudentDateOfBirth'}}}, {$match: {StudentDateOfBirth: 1995}} ]).pretty();

まとめ

MongoDBで月や年単位の条件検索を行う際は、$project$match を組み合わせたアグリゲーションパイプラインが有効です。誕生日の月別集計、契約開始年ごとのデータ抽出など、日付の一部だけをキーにした処理が必要な場面でぜひ活用してください。

  1. MongoDBでネストされた値を取得するクエリの書き方(ドット記法の使い方)

    MongoDBでネストされた値を取得する方法MongoDBでは、ドット記法(dot notation)を使用することで、ドキュメント内にネストされたフィールドの値を簡単に取得できます。ネストされたフィールドにアクセスする際は、「親フィールド名.子フィールド名」の形式で指定します。この記事では、実際にサンプルコレクションを作成し、ネストされた値を取得するクエリの書き方を順を追って解説します。1. ドキュメントを含むコレクションを作成するまず、ネストされたドキュメントを持つコレクションを作成しましょう。以下の例では、nestedQueryDemoというコレクションに従業員情報を挿入しています。従業

  2. MongoDBでDate/ISODateの各コンポーネント(年・月・日・時・分・秒)を取得する方法

    MongoDBでDate(ISODate)の各コンポーネント(年・月・日・時・分・秒など)を取得するには、まずコレクションに日付を含むドキュメントを作成します。ここでは、実際のコード例を通して手順をわかりやすく解説します。1. 日付を含むドキュメントの作成まず、insert()メソッドを使って、現在日時を持つドキュメントをコレクションに挿入します。> db.componentOfDateDemo.insert({"ShippingDate":new Date()}); WriteResult({ "nInserted" : 1 })2. find(