MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Aggiorna con espressione invece di valore

Mi sono imbattuto in questo mentre cercavo l'equivalente MongoDB di SQL in questo modo:

update t
set c1 = c2
where ...

Sergio ha ragione sul fatto che non puoi fare riferimento a un'altra proprietà come valore in un aggiornamento diretto. Tuttavia, db.c.find(...) restituisce un e quel cursore ha un forEach metodo :

Quindi puoi dire cose come questa:

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 } }
    );
});

per aggiornarli uno alla volta senza uscire da MongoDB.

Se stai usando un driver per connetterti a MongoDB, dovrebbe esserci un modo per inviare una stringa di JavaScript in MongoDB; ad esempio, con il driver Ruby useresti 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 } }
        );
    });
})

Le altre lingue dovrebbero essere simili.