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

MongoDBで特定の時間(時)のレコードを検索するクエリの書き方

MongoDBで「時」が特定の値に一致するレコードだけを検索したい場合には、$hour演算子を使用します。$hour演算子は、日付型フィールドから「時」の部分(0〜23の数値)を抽出できる集計演算子です。

この記事では、実際にコレクションを作成し、特定の時間のレコードを抽出する手順を順番に解説します。

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

まず、日付型フィールドを持つドキュメントを含むコレクションを作成します。以下では、顧客名(CustomerName)と注文日時(OrderDatetime)を持つドキュメントを挿入しています。

> db.mongoDbSearchForHoursDemo.insertOne({"CustomerName":"Larry","OrderDatetime":new ISODate("2019-01-31 09:45:50")});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd6e8a86d78f205348bc62a")
}
> db.mongoDbSearchForHoursDemo.insertOne({"CustomerName":"Larry","OrderDatetime":new ISODate("2019-02-21 01:10:01")});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd6e8b86d78f205348bc62b")
}
> db.mongoDbSearchForHoursDemo.insertOne({"CustomerName":"Larry","OrderDatetime":new ISODate("2019-04-01 04:10:11")});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd6e8e26d78f205348bc62c")
}
> db.mongoDbSearchForHoursDemo.insertOne({"CustomerName":"Larry","OrderDatetime":new ISODate("2019-05-11 08:53:01")});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd6e8f26d78f205348bc62d")
}

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

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

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

上記のクエリを実行すると、次のような出力が得られます。

{
   "_id" : ObjectId("5cd6e8a86d78f205348bc62a"),
   "CustomerName" : "Larry",
   "OrderDatetime" : ISODate("2019-01-31T09:45:50Z")
}
{
   "_id" : ObjectId("5cd6e8b86d78f205348bc62b"),
   "CustomerName" : "Larry",
   "OrderDatetime" : ISODate("2019-02-21T01:10:01Z")
}
{
   "_id" : ObjectId("5cd6e8e26d78f205348bc62c"),
   "CustomerName" : "Larry",
   "OrderDatetime" : ISODate("2019-04-01T04:10:11Z")
}
{
   "_id" : ObjectId("5cd6e8f26d78f205348bc62d"),
   "CustomerName" : "Larry",
   "OrderDatetime" : ISODate("2019-05-11T08:53:01Z")
}

3. $hour演算子で特定の時間のレコードを検索する

続いて、特定の「時」に該当するレコードを検索するクエリを見ていきましょう。ここでは、「8時」と「1時」のいずれかに一致するレコードを取得します。

aggregate()パイプラインの中で、まず$projectステージによってOrderDatetimeから時間を抽出し、その後$matchステージで$in演算子を使って対象の時間(8と1)と一致するドキュメントを絞り込みます。

>db.mongoDbSearchForHoursDemo.aggregate([{$project:{SpecificHours:{$hour:"$OrderDatetime"}}},
{$match:{SpecificHours:{"$in":[08,01]}}}]);

このクエリを実行すると、条件に合致する2件のドキュメントが出力されます。出力には、該当するレコードの_idと、抽出された時間(SpecificHours)が表示されます。

{ "_id" : ObjectId("5cd6e8b86d78f205348bc62b"), "SpecificHours" : 1 }
{ "_id" : ObjectId("5cd6e8f26d78f205348bc62d"), "SpecificHours" : 8 }

まとめ

このように、MongoDBでは$projectで日付フィールドから$hour演算子により「時」を抽出し、$match$inを組み合わせることで、日付に関係なく特定の時間帯のレコードを効率的に検索できます。同様の手法は、$minuteや$secondなど他の日付演算子にも応用可能です。

  1. MongoDBで特定のフィールド値のみを更新するクエリの書き方

    MongoDBでは、update()メソッドと$set演算子を組み合わせることで、ドキュメント全体を置き換えることなく、特定のフィールドの値だけを効率的に更新できます。本記事では、実際のコード例を通じて、その具体的な手順をわかりやすく解説します。 1. コレクションとドキュメントの作成 まずは例として、insertOne()メソッドを使って「demo557」というコレクションにドキュメントを挿入します。 > db.demo557.insertOne({Name:Chris}); { acknowledged : true, insertedId : ObjectId(5e8

  2. MongoDBでフィールド値に含まれる「@email」のような文字列を検索する方法

    MongoDBのfind()メソッドを使えば、正規表現(Regex)を活用して、フィールド値の中から特定の文字列を柔軟に検索できます。本記事では、「@email」という文字列を含むドキュメントを検索する方法を、実際のコード例とともに解説します。1. 検索用コレクションの作成まずは、メールアドレスを格納したドキュメントを持つコレクションを作成しましょう。> db.demo727.insertOne({UserId:John@email.com}); { acknowledged : true, insertedId : ObjectId(5eab375f4341781127