MongoDBには$max
があります 指定された値がフィールドの現在の値よりも大きい場合にのみ、フィールドの値を更新できる演算子。
つまり、$max
の場合 値がドキュメントの現在の値である$max
よりも大きい 値が使用されます。それ以外の場合、ドキュメントの値は変更されません。
例
次のようなコレクションがあるとします。
{ "_id" : 1, "exercise" : "deadlift", "bestLift" : 230 } { "_id" : 2, "exercise" : "benchpress", "bestLift" : 100 } { "_id" : 3, "exercise" : "squat", "bestLift" : 210 }
そして、最新のリフトなしで各トレーニングの後にコレクションを更新すると想像してください。この場合、bestLift
のみが必要になります 最新のリフトが以前の最高のリフト(つまり、それぞれのリフトにリストされている現在の重量)よりも重い場合に更新されるフィールド。
この場合、$max
を使用できます その結果を達成するためのオペレーター。
例:
db.workout.update(
{ _id: 1 },
{ $max: { bestLift: 240 } }
)
出力:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
このメッセージは、1つのドキュメントが一致して更新されたことを示しています。
コレクションをもう一度確認しましょう。
db.workout.find()
結果:
{ "_id" : 1, "exercise" : "deadlift", "bestLift" : 240 } { "_id" : 2, "exercise" : "benchpress", "bestLift" : 100 } { "_id" : 3, "exercise" : "squat", "bestLift" : 210 }
bestLift
最初のドキュメントのフィールドが新しい値で更新されました。これは、240が以前の値である230よりも高いためです。
値が低い場合
$max
で指定された値の場合 ドキュメント内の既存の値よりも低い場合、何も更新されません。
例:
db.workout.update(
{ _id: 1 },
{ $max: { bestLift: 220 } }
)
出力:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
メッセージから、何も更新されていないことがわかります。
コレクションをもう一度確認しましょう。
db.workout.find()
結果:
{ "_id" : 1, "exercise" : "deadlift", "bestLift" : 240 } { "_id" : 2, "exercise" : "benchpress", "bestLift" : 100 } { "_id" : 3, "exercise" : "squat", "bestLift" : 210 }
220に更新しようとしても、値は240のままであることがわかります。これは、$max
を使用したため、予想されます。 。
日付
$max
を使用できます 日付フィールド。
collection
があるとします。 次のドキュメントでサブスクリプションと呼ばれます:
{ "_id" : 1, "expiry" : ISODate("2021-01-01T00:00:00Z") }
ドキュメントの現在の日付よりも前の日付で日付を更新してみましょう。
db.subscriptions.update(
{ _id: 1 },
{ $max: { expiry: new Date("2020-01-01") } }
)
ここでは、2021
から年を更新しようとしています。 2020
へ 。新しい日付が既存の日付よりも早い場合、次のようになります。
db.subscriptions.find()
結果:
{ "_id" : 1, "expiry" : ISODate("2021-01-01T00:00:00Z") }
予想どおり、何も更新されませんでした。
後日更新してみましょう。
db.subscriptions.update(
{ _id: 1 },
{ $max: { expiry: new Date("2022-01-01") } }
)
出力:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
メッセージから、ドキュメントが更新されたことがわかります。
確認しましょう。
db.subscriptions.find()
結果:
{ "_id" : 1, "expiry" : ISODate("2022-01-01T00:00:00Z") }
日付は予想どおりに更新されました。