MongoDB で 2つの日付の間のオブジェクトを検索する

Tahseen Tauseef 2024年2月15日
  1. MongoDB での日付範囲を使用したクエリ
  2. MongoDB の $gt
  3. MongoDB の $gte
  4. MongoDB の $lt
  5. MongoDB の $lte
  6. MongoDB で 2つの日付の間のドキュメントを検索する
  7. MongoDB で特定の日付以降のドキュメントを検索する
  8. MongoDB で特定の日付より前のドキュメントを検索する
  9. MongoDB の日付に基づく比較
MongoDB で 2つの日付の間のオブジェクトを検索する

この記事では、2つの日付の間でオブジェクトを見つける問題について簡単に説明します。 また、この目的で使用される演算子 $gte$lte$gt、および $lt について簡単に説明します。

MongoDB での日付範囲を使用したクエリ

このセクションでは、MongoDB 日付範囲クエリを作成して、タイムスタンプまたは日付範囲に基づいてデータを取得する方法について説明します。 たとえば、MongoDB の日付クエリは、時刻または日付より大きいか小さい日付です。

日付範囲を使用して MongoDB でクエリを実行するには、以下で説明する基本的な構文を使用します。

db.collection.find({
    day: {
        $gt: ISODate("2020-01-21"),
        $lt: ISODate("2020-01-24")
    }
})

day フィールドが 2020-01-21 以上 2020-01-24 以下であるコレクション内のすべてのアイテムが、このクエリによって返されます。 上記の手順は簡単です。

ただし、これらの方向にはいくつかの小さな矛盾があります。

MongoDB の $gt

構文:

{ field: { $gt: value } }

field の値が指定された value より大きい (つまり >) ため、$gt はそれらのドキュメントを選択します。

ほとんどのデータ型では、比較演算子は、BSON 型がクエリ値の型と一致する場合にのみフィールドの比較を実行します。 ただし、MongoDB のタイプ ブラケットにより、限られたクロス BSON 比較が可能になります。

以下の例では、inventory コレクションを使用しています。 これは、以下のすべての例で使用されるサンプル データベースです。

db.inventory.insertMany( [
   {
      "item": "nuts", "quantity": 31,
      "carrier": { "name": "import", "fee": 3 }
   },
   {
      "item": "screws", "quantity": 50,
      "carrier": { "name": "import", "fee": 4 }
   },
   {
      "item": "washers", "quantity": 11,
      "carrier": { "name": "import", "fee": 1 }
   }
] )

ドキュメント フィールドの一致

inventory コレクションで quantity20 より大きいすべてのドキュメントを選択します。

db.inventory.find( { quantity: { $gt: 20 } } )

出力:

gt 演算子を使用

埋め込まれたドキュメント フィールドに基づいて更新を実行する

以下の例では、埋め込みドキュメント内のフィールドに対する $gt 比較に基づいて price フィールドを設定します。

db.inventory.updateOne(
   { "carrier.fee": { $gt: 2 } }, { $set: { "price": 9.99 } }
)

出力:

gt 演算子 2 を使用

この updateOne() 関数は、carrier という名前の埋め込みドキュメント内の fee サブフィールドをチェックします。 最初のドキュメントは、2 より大きい fee の値を見つけ、price: 9.99 を設定します。

carrier.fee が 2 を超える場合にすべてのドキュメントの price フィールドの値を調整するには、updateMany() を使用します。

MongoDB の $gte

構文:

{ field: { $gte: value } }

$gte は、指定された値 (value など) 以上の (>= などの) field 値を持つドキュメントを選択します。

ほとんどのデータ型では、比較演算子は、BSON 型がクエリ値の型と一致する場合にのみフィールドの比較を実行します。 ただし、MongoDB のタイプ ブラケットにより、限られたクロス BSON 比較が可能になります。

ドキュメント フィールドの一致

inventory コレクションで、数量が 20 以上のすべてのドキュメントを選択します。

db.inventory.find( { quantity: { $gte: 20 } } )

出力:

gte 演算子を使用

埋め込まれたドキュメント フィールドに基づいて更新を実行する

price フィールドは、次の例の埋め込みドキュメントのフィールドに対して $gte 比較を使用して設定されます。

db.inventory.updateMany(
   { "carrier.fee": { $gte: 2 } }, { $set: { "price": 9.99 } }
)

出力:

gte 演算子 2 を使用

この updateOne() 関数は、carrier という名前の埋め込みドキュメント内の fee サブフィールドをチェックします。 fee の値が 2 以上の場合、price: 9.99 が各ドキュメントに追加されます。

carrier.fee が 2 より大きい場合、updateOne() を使用して、最初のページのみに price フィールドの値を設定します。

MongoDB の $lt

構文:

{ field: { $lt: value } }

$lt は、field 値が指定された value より小さい (または等しい) ドキュメントを選択します。

ほとんどのデータ型では、比較演算子は、BSON 型がクエリ値の型と一致する場合にのみフィールドの比較を実行します。 ただし、MongoDB のタイプ ブラケットにより、限られたクロス BSON 比較が可能になります。

ドキュメント フィールドの一致

inventory コレクションで数量が 20 未満のすべてのドキュメントを選択します。

db.inventory.find( { quantity: { $lt: 20 } } )

出力:

lt 演算子を使用

埋め込まれたドキュメント フィールドに基づいて更新を実行する

price フィールドは、次の例の埋め込みドキュメント内のフィールドとの $lt 比較に基づいて設定されます。

db.inventory.updateMany( { "carrier.fee": { $lt: 20 } }, { $set: { price: 9.99 } } )

出力:

lt 演算子 2 を使用

この updateOne() 関数は、carrier という名前の埋め込みドキュメント内の fee サブフィールドをチェックします。 charge の値が 2 未満の場合、price: 9.99 を各レコードに追加します。

carrier.fee が 2 未満の場合、updateOne() を使用して、最初のページのみに price フィールドの値を設定します。

MongoDB の $lte

構文:

{ field: { $lte: value } }

$lte は、field 値が指定された value 以下 (つまり、=) のドキュメントを選択します。

ほとんどのデータ型では、比較演算子は、BSON 型がクエリ値の型と一致する場合にのみフィールドの比較を実行します。 ただし、MongoDB のタイプ ブラケットにより、限られたクロス BSON 比較が可能になります。

ドキュメント フィールドの一致

次の例を検討してください。

db.inventory.find( { quantity: { $lte: 20 } } )

このクエリは、20 以下の数量フィールド値を持つ inventory コレクション内のすべてのエントリを選択します。

出力:

lte 演算子を使用

埋め込まれたドキュメント フィールドに基づいて更新を実行する

price フィールドは、次の例の埋め込みドキュメントのフィールドに対して $lte 比較を使用して設定されます。

db.inventory.updateMany(
   { "carrier.fee": { $lte: 5 } }, { $set: { price: 9.99 } }
)

出力:

lte 演算子 2 を使用

この updateMany() 関数は、carrier という名前の埋め込みドキュメントで fee サブフィールドを探します。 fee の値が 5 以下の場合、price: 9.99 が各ドキュメントに追加されます。

carrier.fee が 5 以下の場合、updateOne() を使用して、最初のページのみの price フィールドの値を変更します。

次の情報では、付属のドキュメントを使用して、この構文をデータ コレクションに適用する方法について説明します。

db.data.insertOne({day: new Date("2022-01-20"), amount: 40})
db.data.insertOne({day: new Date("2022-01-21"), amount: 32})
db.data.insertOne({day: new Date("2022-01-22"), amount: 19})
db.data.insertOne({day: new Date("2022-01-23"), amount: 29})
db.data.insertOne({day: new Date("2022-01-24"), amount: 35})

MongoDB で 2つの日付の間のドキュメントを検索する

次のクエリを使用して、2つの日付の間に day フィールドがあるすべてのドキュメントを検索します。

db.data.find({
    day: {
        $gt: ISODate("2020-01-21"),
        $lt: ISODate("2020-01-24")
    }
})

上記のクエリは、以下に示すように次のドキュメントを返します。

{ _id: ObjectId("618548bc7529c93ea0b41490"),
  day: 2020-01-22T00:00:00.000Z,
  amount: 19 }

{ _id: ObjectId("618548bc7529c93ea0b41491"),
  day: 2020-01-23T00:00:00.000Z,
  amount: 29 }

MongoDB で特定の日付以降のドキュメントを検索する

次のクエリを使用して、day フィールドが指定された日付より後の日付に設定されているすべてのドキュメントを検索します。

db.data.find({
    day: {
        $gt: ISODate("2020-01-22")
    }
})

上記のクエリは、次のドキュメントを返します。

{ _id: ObjectId("618548bc7529c93ea0b41491"),
  day: 2020-01-23T00:00:00.000Z,
  amount: 29 }

{ _id: ObjectId("618548bc7529c93ea0b41492"),
  day: 2020-01-24T00:00:00.000Z,
  amount: 35 }

MongoDB で特定の日付より前のドキュメントを検索する

day フィールドが特定の日付より前に設定されているすべてのドキュメントを検索するには、次のクエリを使用します。

db.data.find({
    day: {
        $lt: ISODate("2020-01-22")
    }
})

上記のクエリは、次のドキュメントを返します。

{ _id: ObjectId("618548bc7529c93ea0b4148e"),
  day: 2020-01-20T00:00:00.000Z,
  amount: 40 }

{ _id: ObjectId("618548bc7529c93ea0b4148f"),
  day: 2020-01-21T00:00:00.000Z,
  amount: 32 }

MongoDB の日付に基づく比較

MongoDB を使用して、日付に応じてクエリを返す方法を見てみましょう。

アイデアをよりよく理解するために、ドキュメントを使用して data というコレクションを作成します。 以下は、レコードを含むコレクションを構築するためのクエリです。

db.data.insertOne({"PassengerName":"John","PassengerAge":23,"PassengerArrivalTime":new ISODate("2018-03-10 14:45:56")});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c8a57be9064dcd4a68b70e4")
}
db.data.insertOne({"PassengerName":"Larry","PassengerAge":21,"PassengerArrivalTime":new ISODate("2018-05-19 11:10:23")});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c8a57bf9064dcd4a68b70e5")
}
db.data.insertOne({"PassengerName":"Mike","PassengerAge":24,"PassengerArrivalTime":new ISODate("2018-08-25 16:40:12")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c8a57bf9064dcd4a68b70e6")
}
db.data.insertOne({"PassengerName":"Carol","PassengerAge":26,"PassengerArrivalTime":new ISODate("2019-01-29 09:45:10")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c8a57bf9064dcd4a68b70e7")
}

find() 関数を使用すると、コレクション内のすべてのドキュメントが選択されます。 これに対するクエリは次のとおりです。

db.data queryFromDate.find().pretty();

上記のクエリは、下のスクリーンショットに示すように、次のドキュメントを返します。

戻りクエリ

以下は、日付ベースの戻りクエリです。 作成日が 2018-05-19T11:10:23Z より後のレコードは、次のように参照されます。

> db.data queryFromDate.find({"PassengerArrivalTime" : { $gte : new ISODate("2018-05-19T11:10:23Z") }}).pretty();

このクエリは、次のスクリーンショットに示すように、次のドキュメントを返します。

戻りクエリ 1

したがって、この記事の助けを借りて、ユーザーは Date() メソッドの使用に関する情報にたどり着きました。 例では、$gte および $lte コマンドについて簡単に説明しています。

さらに、データに基づく戻りクエリもコード スニペットで示されています。

関連記事 - MongoDB Date