MongoDB a un $max
opérateur qui permet de mettre à jour la valeur d'un champ uniquement si la valeur spécifiée est supérieure à la valeur courante du champ.
En d'autres termes, si le $max
la valeur est supérieure à la valeur actuelle dans le document, le $max
valeur est utilisée. Sinon, la valeur du document reste inchangée.
Exemple
Supposons que nous ayons une collection comme celle-ci :
{ "_id" : 1, "exercise" : "deadlift", "bestLift" : 230 } { "_id" : 2, "exercise" : "benchpress", "bestLift" : 100 } { "_id" : 3, "exercise" : "squat", "bestLift" : 210 }
Et imaginez que nous mettions à jour la collection après chaque séance d'entraînement avec les derniers ascenseurs. Dans ce cas, nous ne voudrions que le bestLift
champ à mettre à jour si notre dernière levée était plus lourde que notre précédente meilleure levée (c'est-à-dire le poids actuel indiqué pour la levée respective).
Dans ce cas, nous pourrions utiliser le $max
opérateur pour atteindre ce résultat.
Exemple :
db.workout.update(
{ _id: 1 },
{ $max: { bestLift: 240 } }
)
Sortie :
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Ce message nous indique qu'un document correspond et a été mis à jour.
Vérifions à nouveau la collection.
db.workout.find()
Résultat :
{ "_id" : 1, "exercise" : "deadlift", "bestLift" : 240 } { "_id" : 2, "exercise" : "benchpress", "bestLift" : 100 } { "_id" : 3, "exercise" : "squat", "bestLift" : 210 }
Nous pouvons voir que le bestLift
champ du premier document a été mis à jour avec la nouvelle valeur. En effet, 240 est supérieur à sa valeur précédente de 230.
Lorsque la valeur est inférieure
Lorsque la valeur spécifiée avec $max
est inférieure à la valeur existante dans le document, rien n'est mis à jour.
Exemple :
db.workout.update(
{ _id: 1 },
{ $max: { bestLift: 220 } }
)
Sortie :
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
Nous pouvons voir par le message que rien n'a été mis à jour.
Vérifions à nouveau la collection.
db.workout.find()
Résultat :
{ "_id" : 1, "exercise" : "deadlift", "bestLift" : 240 } { "_id" : 2, "exercise" : "benchpress", "bestLift" : 100 } { "_id" : 3, "exercise" : "squat", "bestLift" : 210 }
Nous pouvons voir que la valeur reste à 240, même si nous avons essayé de la mettre à jour à 220. C'est normal, car nous avons utilisé $max
.
Dates
Vous pouvez utiliser $max
sur les champs de date.
Supposons que nous ayons une collection
appelés abonnements avec le document suivant :
{ "_id" : 1, "expiry" : ISODate("2021-01-01T00:00:00Z") }
Essayons de mettre à jour la date avec une date antérieure à la date actuelle dans le document.
db.subscriptions.update(
{ _id: 1 },
{ $max: { expiry: new Date("2020-01-01") } }
)
Ici, nous essayons de mettre à jour l'année à partir de 2021
à 2020
. Étant donné que la nouvelle date est antérieure à celle existante, nous obtenons ce qui suit.
db.subscriptions.find()
Résultat :
{ "_id" : 1, "expiry" : ISODate("2021-01-01T00:00:00Z") }
Comme prévu, rien n'a été mis à jour.
Essayons de le mettre à jour avec une date ultérieure.
db.subscriptions.update(
{ _id: 1 },
{ $max: { expiry: new Date("2022-01-01") } }
)
Sortie :
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Nous pouvons voir par le message que le document a été mis à jour.
Vérifions.
db.subscriptions.find()
Résultat :
{ "_id" : 1, "expiry" : ISODate("2022-01-01T00:00:00Z") }
La date a été mise à jour comme prévu.