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

MongoDBクエリ:プロジェクション時にフィールド値を変換して「月の日」を作成する方法

フィールド値を変換して、日時の「月の日」(day of month)を作成したい場合は、MongoDBのaggregate()メソッドを使用します。本記事では、Unixタイムスタンプ形式で保存された数値フィールドから、実際の日付情報を取り出す手順を具体的なサンプルコードとともに解説します。

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

まずは、ドキュメントを含むコレクションを作成しましょう。

> db.demo209.insertOne(
...   {
...      "_id" : "101",
...      "details" : [
...         {
...            "dat" : 1528929908,
...            "Name" : "Chris"
...         },
...         {
...            "dat" : 1529082069,
...            "Name":"Carol"
...         }
...      ],
...      "Age" : 25,
...      "CountryName" : "US"
...   }
...);
{ "acknowledged" : true, "insertedId" : "101" }

登録したドキュメントの確認

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

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

これにより、次のような出力が得られます。

{
    "_id" : "101",
    "details" : [
       {
           "dat" : 1528929908,
           "Name" : "Chris"
        },
        {
           "dat" : 1529082069,
           "Name" : "Carol"
        }
    ],
    "Age" : 25,
    "CountryName" : "US"
}

フィールド値を変換して「月の日」を取得するクエリ

以下は、プロジェクション($project)の中でフィールド値を変換し、「月の日」を作成するための集計クエリです。

> db.demo209.aggregate({
...   "$unwind": "$details"
...   }, {
...      "$project": {
...         "Age": 1,
...         "CountryName": 1,
...         "Name": "$details.Name",
...         "DayOfMonth": {
...            "$dayOfMonth": {
...               "$add": [new Date(0), {
...                  "$multiply": ["$details.dat", 1000]
...               }]
...            }
...         }
...   }
...})

実行すると、次のような出力が得られます。

{ "_id" : "101", "Age" : 25, "CountryName" : "US", "Name" : "Chris", "DayOfMonth" : 13 }
{ "_id" : "101", "Age" : 25, "CountryName" : "US", "Name" : "Carol", "DayOfMonth" : 15 }

クエリの仕組みの解説

このパイプラインでは、以下の演算子が連携して動作しています。

  • $unwind: details配列を要素ごとに展開し、各要素を個別のドキュメントとして扱えるようにします。
  • $multiply: Unixタイムスタンプ(秒単位)であるdatフィールドの値を1000倍し、ミリ秒単位に変換します。
  • $add: エポック起点となるnew Date(0)(1970年1月1日)に変換後のミリ秒を加算し、Date型の日時を生成します。
  • $dayOfMonth: 生成されたDate型の値から「月の中の日」を抽出し、新しいフィールドDayOfMonthとして出力します。

このように、秒単位のUnixタイムスタンプをMongoDBのDate型へ変換することで、年・月・日・時刻など、さまざまな日付演算子を自由に活用できるようになります。同様の手法は、$year$month$hourなどの日付演算子にも応用可能です。

  1. 【MongoDB】idがドキュメント内の配列フィールドの値と一致する場合に除外するクエリの書き方

    MongoDBでは、ドキュメントの id フィールドの値が、同一ドキュメント内の配列型フィールド(例: subjectid)に含まれている場合に、そのドキュメントを検索結果から除外したいケースがあります。このような条件を実現するには、 $expr 演算子と組み合わせて $not および $in を使用します。本記事では、サンプルコレクションの作成からクエリの実行、出力結果の確認までを順を追って解説します。 サンプルコレクションの作成 まずは、動作確認用のドキュメントを含むコレクションを作成します。ここでは、 id フィールドと、文字列の配列を持つ subjectid フィールドを備えた2件のド

  2. Python PandasでPeriodIndexを作成し、月の日数を取得する方法

    pandas.PeriodIndex()メソッドを使用すると、PeriodIndexを作成できます。また、各月の日数を取得するには、PeriodIndex.daysinmonthプロパティを利用します。この記事では、実際のコード例とともにその手順をわかりやすく解説します。 ライブラリのインポート まず、必要なライブラリをインポートします。 import pandas as pd PeriodIndexオブジェクトの作成 PeriodIndexは、時間軸上の一定の期間(period)を表す序数値を格納した不変(immutable)のndarrayです。ここでは「freq」パラメータを使って頻度を