Vous ne pouvez pas référencer les propriétés du document actuel à partir d'un update(). Vous devrez soit parcourir tous les documents et les mettre à jour, soit utiliser l'agrégation avec le $multiply
expression en tant qu'opération arithmétique en agrégation dans $project
pipeline pour multiplier le num_tires
champ avec la constante :
db.cars.aggregate([
{
$match: {
make: 'Honda'
}
},
{
$project: {
make: 1,
model: 1,
num_tires: 1,
price: {
$multiply: [ "$num_tires", 500 ]
}
}
}
])
Ou vous pouvez mettre à jour votre schéma pour inclure un champ arbitraire unit_price: {type: Number, default: 500}
que vous pouvez ensuite utiliser comme $multiply: [ "$num_tires", "$unit_price" ]
dans le $project
pipeline.
Une autre alternative consiste à parcourir tous les documents correspondants et à les mettre à jour à l'aide de la méthode de sauvegarde comme celle-ci :
var Car = require('car');
Car.find({make: 'Honda'}).snapshot().forEach(
function (e) {
// update document, using its own properties
e.price = e.num_tires * 500;
// remove old property
delete e.price;
// save the updated document
Car.save(e);
}
);
Ou en utilisant le $set
opérateur :
var Car = require('car');
Car.find().forEach(
function (elem) {
Car.update(
{
_id: elem._id,
make: "Honda"
},
{
$set: {
price: elem.num_tires * 500
}
},
{multi: true},
function(err) {
console.log("There's an error ", err);
}
);
}
);
Si vous aviez une valeur par défaut pour le prix qui est égale au num_tires
, vous voudrez peut-être simplement mettre à jour le price
champ sans faire référence à un autre champ dans le même document, utilisez le $mul
opérateur :
var Car = require('car');
Car.update(
{make: 'Honda'},
{$mul: {price: 500}},
{multi: true},
function(err) {
console.log("There's an error ", err);
}
});