Právě jsem na to narazil při hledání ekvivalentu MongoDB SQL takto:
update t
set c1 = c2
where ...
Sergio má pravdu, že v přímé aktualizaci nemůžete odkazovat na jinou vlastnost jako na hodnotu. Nicméně db.c.find(...)
vrátí kurzor a tento kurzor má forEach
metoda
:
Takže můžete říkat věci jako toto:
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 } }
);
});
aktualizovat je jeden po druhém, aniž byste opustili MongoDB.
Pokud pro připojení k MongoDB používáte ovladač, měl by existovat nějaký způsob, jak poslat řetězec JavaScriptu do MongoDB; například s ovladačem Ruby byste použili 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 } }
);
});
})
Ostatní jazyky by měly být podobné.