Jag stötte precis på detta när jag sökte efter MongoDB-motsvarigheten till SQL så här:
update t
set c1 = c2
where ...
Sergio har rätt i att du inte kan referera till en annan egenskap som ett värde i en rak uppdatering. Men db.c.find(...)
returnerar en markör och den markören har en forEach
metod
:
Så du kan säga sådant här:
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 } }
);
});
att uppdatera dem en i taget utan att lämna MongoDB.
Om du använder en drivrutin för att ansluta till MongoDB så borde det finnas något sätt att skicka en JavaScript-sträng till MongoDB; till exempel med Ruby-drivrutinen skulle du använda 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 } }
);
});
})
Andra språk bör vara liknande.