Acabei de me deparar com isso enquanto procurava o equivalente do MongoDB ao SQL assim:
update t
set c1 = c2
where ...
Sergio está correto que você não pode referenciar outra propriedade como um valor em uma atualização direta. No entanto,
db.c.find(...)
retorna um cursor e esse cursor tem um forEach
método
:Então você pode dizer coisas assim:
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 } }
);
});
para atualizá-los um de cada vez sem sair do MongoDB.
Se você estiver usando um driver para se conectar ao MongoDB, deve haver alguma maneira de enviar uma string de JavaScript para o MongoDB; por exemplo, com o driver Ruby você usaria
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 } }
);
});
})
Outras linguagens devem ser semelhantes.