Je viens de tomber sur ceci en cherchant l'équivalent MongoDB de SQL comme ceci :
update t
set c1 = c2
where ...
Sergio a raison de dire que vous ne pouvez pas référencer une autre propriété en tant que valeur dans une mise à jour directe. Cependant, db.c.find(...)
renvoie un curseur et ce curseur a un forEach
méthode
:
Vous pouvez donc dire des choses comme ceci :
db.QUESTIONS.find({}, {_id: true, i_up: true, i_down: true}).forEach(function(q) {
db.QUESTIONS.update(
{ _id: q._id },
{ $set: { i_pp: q.i_up * 100 - q.i_down * 20 } }
);
});
pour les mettre à jour une par une sans quitter MongoDB.
Si vous utilisez un pilote pour vous connecter à MongoDB, il devrait y avoir un moyen d'envoyer une chaîne de caractères JavaScript dans MongoDB ; par exemple, avec le pilote Ruby, vous utiliseriez eval
:
connection.eval(%q{
db.QUESTIONS.find({}, {_id: true, i_up: true, i_down: true}).forEach(function(q) {
db.QUESTIONS.update(
{ _id: q._id },
{ $set: { i_pp: q.i_up * 100 - q.i_down * 20 } }
);
});
})
Les autres langues doivent être similaires.