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などの日付演算子にも応用可能です。
-
【MongoDB】idがドキュメント内の配列フィールドの値と一致する場合に除外するクエリの書き方
MongoDBでは、ドキュメントの id フィールドの値が、同一ドキュメント内の配列型フィールド(例: subjectid)に含まれている場合に、そのドキュメントを検索結果から除外したいケースがあります。このような条件を実現するには、 $expr 演算子と組み合わせて $not および $in を使用します。本記事では、サンプルコレクションの作成からクエリの実行、出力結果の確認までを順を追って解説します。 サンプルコレクションの作成 まずは、動作確認用のドキュメントを含むコレクションを作成します。ここでは、 id フィールドと、文字列の配列を持つ subjectid フィールドを備えた2件のド
-
Python PandasでPeriodIndexを作成し、月の日数を取得する方法
pandas.PeriodIndex()メソッドを使用すると、PeriodIndexを作成できます。また、各月の日数を取得するには、PeriodIndex.daysinmonthプロパティを利用します。この記事では、実際のコード例とともにその手順をわかりやすく解説します。 ライブラリのインポート まず、必要なライブラリをインポートします。 import pandas as pd PeriodIndexオブジェクトの作成 PeriodIndexは、時間軸上の一定の期間(period)を表す序数値を格納した不変(immutable)のndarrayです。ここでは「freq」パラメータを使って頻度を