MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Atualizar com expressão em vez de valor


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.