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") } Датата беше актуализирана според очакванията.