MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

MongoDB $ max

MongoDB ha un $max operatore che consente di aggiornare il valore di un campo solo se il valore specificato è maggiore del valore corrente del campo.

In altre parole, se il $max value è maggiore del valore corrente nel documento, il $max viene utilizzato il valore. In caso contrario, il valore del documento rimane invariato.

Esempio

Supponiamo di avere una raccolta come questa:

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

E immagina di aggiornare la collezione dopo ogni allenamento senza gli ultimi sollevamenti. In questo caso, vorremmo solo il bestLift campo da aggiornare se il nostro ultimo sollevamento è stato più pesante del nostro migliore sollevamento precedente (ovvero il peso corrente elencato per il rispettivo sollevamento).

In questo caso potremmo usare il $max operatore per raggiungere tale risultato.

Esempio:

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

Uscita:

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

Questo messaggio ci dice che un documento corrisponde ed è stato aggiornato.

Controlliamo di nuovo la collezione.

db.workout.find()

Risultato:

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

Possiamo vedere che il bestLift il campo del primo documento è stato aggiornato con il nuovo valore. Questo perché 240 è superiore al suo valore precedente di 230.

Quando il valore è inferiore

Quando il valore specificato con $max è inferiore al valore esistente nel documento, non viene aggiornato nulla.

Esempio:

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

Uscita:

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

Possiamo vedere dal messaggio che non è stato aggiornato nulla.

Controlliamo di nuovo la collezione.

db.workout.find()

Risultato:

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

Possiamo vedere che il valore rimane a 240, anche se abbiamo provato ad aggiornarlo a 220. Questo è previsto, perché abbiamo usato $max .

Date

Puoi usare $max nei campi della data.

Supponiamo di avere una collection chiamate sottoscrizioni con il seguente documento:

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

Proviamo ad aggiornare la data con una data anteriore alla data corrente nel documento.

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

Qui, proviamo ad aggiornare l'anno da 2021 a 2020 . Dato che la nuova data è precedente a quella esistente, otteniamo quanto segue.

db.subscriptions.find()

Risultato:

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

Come previsto, nulla è stato aggiornato.

Proviamo ad aggiornarlo con una data successiva.

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

Uscita:

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

Possiamo vedere dal messaggio che il documento è stato aggiornato.

Controlliamo.

db.subscriptions.find()

Risultato:

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

La data è stata aggiornata come previsto.