MongoDBで本日より前に期限切れのドキュメントを取得する方法
MongoDBで「本日より前に期限切れになったドキュメント」を抽出したい場合、$lte(以下)演算子とDate()を組み合わせることで簡単に実現できます。
本記事では、サンプルコレクションの作成から、期限切れドキュメントを取得するクエリの実行まで、具体的な手順を解説します。
1. サンプルコレクションの作成
まずは、日付フィールドを持つドキュメントを格納するコレクションを作成します。ここでは現在の日付を2019-05-11とし、複数の異なる日付を持つドキュメントを挿入していきます。
> db.getDocumentsExpiredDemo.insertOne({"ArrivalDate":new ISODate("2019-05-11")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd563b17924bb85b3f4893b")
}
> db.getDocumentsExpiredDemo.insertOne({"ArrivalDate":new ISODate("2019-01-01")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd563bf7924bb85b3f4893c")
}
> db.getDocumentsExpiredDemo.insertOne({"ArrivalDate":new ISODate("2019-05-10")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd563ca7924bb85b3f4893d")
}
> db.getDocumentsExpiredDemo.insertOne({"ArrivalDate":new ISODate("2019-02-01")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd563e77924bb85b3f4893e")
}上記のコレクションには、次の4つの日付を持つドキュメントが登録されています。
- 2019-05-11(基準となる当日)
- 2019-01-01
- 2019-05-10
- 2019-02-01
2. コレクション内の全ドキュメントを確認する
find()メソッドにpretty()を組み合わせると、コレクション内のすべてのドキュメントを見やすい形式で表示できます。
> db.getDocumentsExpiredDemo.find().pretty();
実行結果は以下の通りです。
{
"_id" : ObjectId("5cd563b17924bb85b3f4893b"),
"ArrivalDate" : ISODate("2019-05-11T00:00:00Z")
}
{
"_id" : ObjectId("5cd563bf7924bb85b3f4893c"),
"ArrivalDate" : ISODate("2019-01-01T00:00:00Z")
}
{
"_id" : ObjectId("5cd563ca7924bb85b3f4893d"),
"ArrivalDate" : ISODate("2019-05-10T00:00:00Z")
}
{
"_id" : ObjectId("5cd563e77924bb85b3f4893e"),
"ArrivalDate" : ISODate("2019-02-01T00:00:00Z")
}3. 本日より前に期限切れのドキュメントを取得するクエリ
それでは本題です。$lte演算子に対して new Date() を指定することで、「現在の日時以前」の日付を持つドキュメントだけを抽出できます。
> db.getDocumentsExpiredDemo.find({ "ArrivalDate": { $lte : new Date()}});実行すると、以下のように本日(2019-05-11)より前の日付を持つ3件のドキュメントのみが出力されます。基準日の2019-05-11自体は除外されている点に注目してください。
{ "_id" : ObjectId("5cd563bf7924bb85b3f4893c"), "ArrivalDate" : ISODate("2019-01-01T00:00:00Z") }
{ "_id" : ObjectId("5cd563ca7924bb85b3f4893d"), "ArrivalDate" : ISODate("2019-05-10T00:00:00Z") }
{ "_id" : ObjectId("5cd563e77924bb85b3f4893e"), "ArrivalDate" : ISODate("2019-02-01T00:00:00Z") }補足:$ltとの違い
$lteは「指定した値以下」を意味するため、new Date()の時刻以降に挿入された同日内のデータも含まれる可能性があります。厳密に「今日より前」だけを対象にしたい場合は、$lt(未満)を使用するか、日付の範囲を明示的に指定することをおすすめします。
また、期限切れデータの自動削除が必要な場合は、TTLインデックス(expireAfterSeconds)の活用も検討するとよいでしょう。
-
MongoDBの$or演算子で複数条件に一致するドキュメントを取得する方法
はじめにMongoDBでは、$or演算子を使うことで、複数の条件のうちいずれか1つでも一致したドキュメントを取得できます。本記事では、サンプルコレクションを作成し、$or演算子を用いたOR条件検索の具体的な方法を解説します。サンプルコレクションの作成まず、insertOne()メソッドを使って、demo711というコレクションにドキュメントを挿入していきましょう。> db.demo711.insertOne({Name:"John","Marks":75,Age:21,status:"Active"}); { "
-
MongoDBで特定フィールドの配列要素数を取得する方法($size演算子の使い方)
MongoDBでドキュメント内の特定フィールド(配列)に含まれる要素の数をカウントしたい場合は、集計パイプライン(aggregate)と$size演算子を組み合わせるのが最も簡単な方法です。この記事では、実際のコレクションを作成しながら、配列要素数を取得する具体的な手順を解説します。1. サンプルコレクションの作成まず、配列型のフィールド「Subject」を持つドキュメントを含むコレクションを作成します。> db.demo723.insertOne({Subject:[MySQL,MongoDB]}); { acknowledged : true, insertedId