sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB $max

MongoDB har en $max operator som låter dig uppdatera värdet för ett fält endast om det angivna värdet är större än det aktuella värdet för fältet.

Med andra ord, om $max värdet är större än det aktuella värdet i dokumentet, $max värde används. Annars förblir dokumentets värde oförändrat.

Exempel

Anta att vi har en sådan här samling:

{ "_id" : 1, "exercise" : "deadlift", "bestLift" : 230 }
{ "_id" : 2, "exercise" : "benchpress", "bestLift" : 100 }
{ "_id" : 3, "exercise" : "squat", "bestLift" : 210 }

Och tänk dig att vi uppdaterar kollektionen efter varje träningspass med de senaste lyften. I det här fallet vill vi bara ha bestLift fältet som ska uppdateras om vårt senaste lyft var tyngre än vårt tidigare bästa lyft (dvs. den aktuella vikten som anges för respektive lyft).

I det här fallet kan vi använda $max operatör för att uppnå detta resultat.

Exempel:

db.workout.update( 
  { _id: 1 }, 
  { $max: { bestLift: 240 } } 
)

Utdata:

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

Detta meddelande berättar att ett dokument matchade och uppdaterades.

Låt oss kolla in samlingen igen.

db.workout.find()

Resultat:

{ "_id" : 1, "exercise" : "deadlift", "bestLift" : 240 }
{ "_id" : 2, "exercise" : "benchpress", "bestLift" : 100 }
{ "_id" : 3, "exercise" : "squat", "bestLift" : 210 }

Vi kan se att bestLift fältet för det första dokumentet uppdaterades med det nya värdet. Detta beror på att 240 är högre än dess tidigare värde på 230.

När värdet är lägre

När värdet anges med $max är lägre än det befintliga värdet i dokumentet uppdateras ingenting.

Exempel:

db.workout.update( 
  { _id: 1 }, 
  { $max: { bestLift: 220 } } 
)

Utdata:

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })

Vi kan se på meddelandet att ingenting har uppdaterats.

Låt oss kolla in samlingen igen.

db.workout.find()

Resultat:

{ "_id" : 1, "exercise" : "deadlift", "bestLift" : 240 }
{ "_id" : 2, "exercise" : "benchpress", "bestLift" : 100 }
{ "_id" : 3, "exercise" : "squat", "bestLift" : 210 }

Vi kan se att värdet ligger kvar på 240, även om vi försökte uppdatera det till 220. Detta förväntas eftersom vi använde $max .

Datum

Du kan använda $max på datumfält.

Anta att vi har en collection anropade prenumerationer med följande dokument:

{ "_id" : 1, "expiry" : ISODate("2021-01-01T00:00:00Z") } 

Låt oss försöka uppdatera datumet med ett datum som är tidigare än det aktuella datumet i dokumentet.

db.subscriptions.update( 
  { _id: 1 }, 
  { $max: { expiry: new Date("2020-01-01") } } 
)

Här försöker vi uppdatera årtalet från 2021 till 2020 . Med tanke på att det nya datumet är tidigare än det befintliga får vi följande.

db.subscriptions.find()

Resultat:

{ "_id" : 1, "expiry" : ISODate("2021-01-01T00:00:00Z") }

Som väntat uppdaterades ingenting.

Låt oss försöka uppdatera den med ett senare datum.

db.subscriptions.update( 
  { _id: 1 }, 
  { $max: { expiry: new Date("2022-01-01") } } 
)

Utdata:

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

Vi kan se på meddelandet att dokumentet har uppdaterats.

Låt oss kolla.

db.subscriptions.find()

Resultat:

{ "_id" : 1, "expiry" : ISODate("2022-01-01T00:00:00Z") }

Datumet uppdaterades som förväntat.


  1. Skip/Mock Redis In Junit

  2. Strängfältsvärdeslängd i mongoDB

  3. Hur man hittar frågor som inte använder index eller långsamma i mongodb

  4. Exempel på användning av socket.io-redis