次のようなSQLに相当するMongoDBを検索しているときに、これに遭遇しました。
update t
set c1 = c2
where ...
Sergioは、直接更新で値として別のプロパティを参照できないということは正しいです。ただし、 db.c.find(...)
カーソルを返し、そのカーソルには forEach
があります メソッド
:
したがって、次のように言うことができます:
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 } }
);
});
MongoDBを離れることなく一度に1つずつ更新します。
ドライバーを使用してMongoDBに接続している場合は、JavaScriptの文字列をMongoDBに送信する方法があるはずです。たとえば、Rubyドライバーでは、評価
:
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 } }
);
});
})
他の言語も同様である必要があります。