MongoDBで前月のレコードを取得する方法
MongoDBで前月のレコードを取得する方法
MongoDBで前月のデータを抽出したい場合は、まず現在の日付を取得し、その月から1を引いた日時を計算して、それを検索条件にクエリを実行します。この記事では、サンプルコレクションの作成から前月レコードの取得までの一連の手順を、具体例とともにわかりやすく解説します。
ステップ1:コレクションとドキュメントを作成する
まず、insertOne()メソッドを使って、顧客名(CustomerName)と購入日(PurchaseDate)を含むドキュメントをコレクションに登録します。
> db.findOneMonthAgoData.insertOne({"CustomerName":"Chris","PurchaseDate":new ISODate("2019-12-26")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e04e16c150ee0e76c06a04f")
}
> db.findOneMonthAgoData.insertOne({"CustomerName":"David","PurchaseDate":new ISODate("2019-11-26")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e04e178150ee0e76c06a050")
}
> db.findOneMonthAgoData.insertOne({"CustomerName":"Bob","PurchaseDate":new ISODate("2020-11-26")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e04e186150ee0e76c06a051")
}
ステップ2:すべてのドキュメントを確認する
find()メソッドを使えば、コレクション内の全ドキュメントを一覧表示できます。
> db.findOneMonthAgoData.find();
実行結果は以下の通りです。
{ "_id" : ObjectId("5e04e16c150ee0e76c06a04f"), "CustomerName" : "Chris", "PurchaseDate" : ISODate("2019-12-26T00:00:00Z") }
{ "_id" : ObjectId("5e04e178150ee0e76c06a050"), "CustomerName" : "David", "PurchaseDate" : ISODate("2019-11-26T00:00:00Z") }
{ "_id" : ObjectId("5e04e186150ee0e76c06a051"), "CustomerName" : "Bob", "PurchaseDate" : ISODate("2020-11-26T00:00:00Z") }
ステップ3:前月のレコードを取得するクエリを実行する
いよいよ本題です。JavaScriptのDateオブジェクトで現在日時を取得し、setMonth()メソッドに「getMonth() - 1」を渡すことで、ちょうど1か月前の日時を求めます。その値を$gte(以上)演算子と組み合わせれば、前月以降のレコードだけを抽出できます。
> monthData=new Date();
ISODate("2019-12-26T16:43:04.283Z")
> monthData.setMonth(monthData.getMonth() - 1);
1574786584283
> db.findOneMonthAgoData.find({PurchaseDate:{$gte:monthData}});
このクエリの実行結果は以下のようになります。
{ "_id" : ObjectId("5e04e16c150ee0e76c06a04f"), "CustomerName" : "Chris", "PurchaseDate" : ISODate("2019-12-26T00:00:00Z") }
{ "_id" : ObjectId("5e04e186150ee0e76c06a051"), "CustomerName" : "Bob", "PurchaseDate" : ISODate("2020-11-26T00:00:00Z") }
動作のポイント
$gteは「指定した日時以上」を意味するため、基準日(この例では2019年11月26日)以降のレコードがすべて該当します。そのため、未来の日付であるBobの2020年11月26日のレコードも結果に含まれています。もし「先月の1か月分だけ」を厳密に取得したい場合は、$gteと$lt(未満)を組み合わせて期間の下限と上限を両方指定するとよいでしょう。
-
【MongoDB】ネストされたドキュメントのキー名のみを抽出して表示する方法
MongoDBでは、配列内にネストされたドキュメント(サブドキュメント)のキー名だけを一覧として取得したいケースがあります。本記事では、insertOne()でサンプルデータを作成し、find()で内容を確認した後、集計パイプラインの$reduce、$objectToArray、$map、$concatArraysを組み合わせて、ネストされたドキュメントのキー名のみを抽出する方法を実行例付きで解説します。 1. サンプルコレクションの作成 まず、insertOne()メソッドを使って、detailsフィールドに複数のドキュメントを持つ配列を含むコレクションを作成します。 > db.dem
-
MySQLで郵便番号の最初の部分を取得する方法
SUBSTRING()を使って郵便番号の最初の部分を抽出する郵便番号(PostCode)から最初の部分を取得するには、SUBSTRING()関数を使用します。まずは、サンプル用のテーブルを作成しましょう。mysql> create table DemoTable858(PostCode varchar(100)); Query OK, 0 rows affected (0.56 sec)レコードの挿入INSERTコマンドを使って、テーブルにいくつかのレコードを挿入します。mysql> insert into DemoTable858 values(US90 456); Query