MongoDB で 2つの日付の間のオブジェクトを検索する
- MongoDB での日付範囲を使用したクエリ
-
MongoDB の
$gt
-
MongoDB の
$gte
-
MongoDB の
$lt
-
MongoDB の
$lte
- MongoDB で 2つの日付の間のドキュメントを検索する
- MongoDB で特定の日付以降のドキュメントを検索する
- MongoDB で特定の日付より前のドキュメントを検索する
- MongoDB の日付に基づく比較
この記事では、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
コレクションで quantity
が 20
より大きいすべてのドキュメントを選択します。
db.inventory.find( { quantity: { $gt: 20 } } )
出力:
埋め込まれたドキュメント フィールドに基づいて更新を実行する
以下の例では、埋め込みドキュメント内のフィールドに対する $gt
比較に基づいて price
フィールドを設定します。
db.inventory.updateOne(
{ "carrier.fee": { $gt: 2 } }, { $set: { "price": 9.99 } }
)
出力:
この 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 } } )
出力:
埋め込まれたドキュメント フィールドに基づいて更新を実行する
price
フィールドは、次の例の埋め込みドキュメントのフィールドに対して $gte
比較を使用して設定されます。
db.inventory.updateMany(
{ "carrier.fee": { $gte: 2 } }, { $set: { "price": 9.99 } }
)
出力:
この 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 } } )
出力:
埋め込まれたドキュメント フィールドに基づいて更新を実行する
price
フィールドは、次の例の埋め込みドキュメント内のフィールドとの $lt
比較に基づいて設定されます。
db.inventory.updateMany( { "carrier.fee": { $lt: 20 } }, { $set: { price: 9.99 } } )
出力:
この 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
コレクション内のすべてのエントリを選択します。
出力:
埋め込まれたドキュメント フィールドに基づいて更新を実行する
price
フィールドは、次の例の埋め込みドキュメントのフィールドに対して $lte
比較を使用して設定されます。
db.inventory.updateMany(
{ "carrier.fee": { $lte: 5 } }, { $set: { price: 9.99 } }
)
出力:
この 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();
このクエリは、次のスクリーンショットに示すように、次のドキュメントを返します。
したがって、この記事の助けを借りて、ユーザーは Date()
メソッドの使用に関する情報にたどり着きました。 例では、$gte
および $lte
コマンドについて簡単に説明しています。
さらに、データに基づく戻りクエリもコード スニペットで示されています。