Multiplier le terrain, en valeur, dans Mongodb
J'ai été à la recherche d'un moyen de créer une instruction de mise à jour qui va prendre un champ numérique et de le modifier à l'aide d'une expression. Par exemple, si j'ai un champ appelé de Prix, est-il possible de faire une mise à jour définit Prix à 50% de rabais sur la valeur existante ?
Donc, compte tenu de { Price : 19.99 }
J'aimerais faire db.collection.update({tag : "refurb"}, {$set {Price : Price * 0.50 }}, false, true);
Est-ce possible ou dois-je lire la valeur pour le client, de modifier, puis mise à jour ? Je suppose que la question est alors expressions peuvent être utilisées dans la mise à jour, et peuvent-ils référence au document en cours de mise à jour.
- Veuillez noter que dans une prochaine version de mongo, vous pouvez le faire sans tout cela eval et DB verrouillage presque sans frais. Vérifier et peut-être accepter la nouvelle réponse, de sorte que les nouveaux développeurs de ne pas les utiliser obsolètes info.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez exécuter le code côté serveur avec
db.eval()
.Note va bloquer la DB, il est donc préférable de ne trouver-opération de mise à jour de la paire.
Voir https://docs.mongodb.com/manual/core/server-side-javascript/
$mul
pour un atomique solution.Dans le nouveau Mongo 2.6.x il y a un $mul opérateur. Il permettrait de multiplier la valeur du champ par le nombre avec la syntaxe suivante.
Donc, dans votre cas, vous devez effectuer les opérations suivantes:
De départ
Mongo 4.2
,db.collection.mise à jour()
peut accepter une agrégation de pipeline, enfin, en permettant la mise à jour d'un champ basé sur un autre terrain:La première partie
{}
est le match de la requête, le filtrage des documents de mise à jour (tous les documents dans ce cas).La deuxième partie
[{ $set: { price: ... } }]
est la mise à jour de l'agrégation de pipeline (note carrés de crochets, ce qui signifie l'utilisation d'une agrégation de pipeline).$set
est un nouvel opérateur d'agrégation et un alias de$addFields
. Notez commentprice
est modifié directement sur la base de sa propre valeur ($price
).N'oubliez pas
{ multi: true }
, sinon seul le premier document correspondant sera mis à jour.Bien, c'est possible avec une opération atomique $set.
Vous avez plusieurs options :
Cela dépend vraiment de votre contexte : avec une très faible pression sur la db, j'irais pour la solution de pingw33n. Avec un très haut taux d'utilisation, j'utiliserais la troisième solution.