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 })
Това съобщение ни казва, че един документ съответства и е актуализиран.
Нека проверим колекцията отново.
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 }
Можем да видим, че стойността остава на 240, въпреки че се опитахме да я актуализираме до 220. Това се очаква, защото използвахме $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") }
Датата беше актуализирана според очакванията.