Tôi vừa bắt gặp điều này trong khi tìm kiếm MongoDB tương đương với SQL như thế này:
update t
set c1 = c2
where ...
Sergio đúng là bạn không thể tham chiếu thuộc tính khác dưới dạng giá trị trong một bản cập nhật trực tiếp. Tuy nhiên, db.c.find(...)
trả về con trỏ và con trỏ đó có forEach
phương pháp
:
Vì vậy, bạn có thể nói những điều như sau:
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 } }
);
});
để cập nhật chúng lần lượt mà không cần rời khỏi MongoDB.
Nếu bạn đang sử dụng trình điều khiển để kết nối với MongoDB thì sẽ có một số cách để gửi một chuỗi JavaScript vào MongoDB; ví dụ:với trình điều khiển Ruby, bạn sẽ sử dụng 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 } }
);
});
})
Các ngôn ngữ khác cũng phải tương tự.