sql >> Base de Datos >  >> NoSQL >> MongoDB

Actualizar con expresión en lugar de valor

Acabo de encontrar esto mientras buscaba el equivalente MongoDB de SQL como este:

update t
set c1 = c2
where ...

Sergio tiene razón en que no puede hacer referencia a otra propiedad como valor en una actualización directa. Sin embargo, db.c.find(...) devuelve un cursor y ese cursor tiene un forEach método :

Así que puedes decir cosas como esta:

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 actualizarlos uno a la vez sin salir de MongoDB.

Si está utilizando un controlador para conectarse a MongoDB, entonces debería haber alguna forma de enviar una cadena de JavaScript a MongoDB; por ejemplo, con el controlador Ruby usaría 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 } }
        );
    });
})

Otros idiomas deberían ser similares.