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.