不幸的是,MongoDB
查詢不夠靈活,無法觸發後查詢事件。你能做到這一點有兩種方式,但都涉及到多單查詢發射更多:
第一種方法,包括:
- 查找和更新所有
unpaid >= 500
記錄在一個單一的 更新語句。
- 後面跟着另一個更新語句,它將
paid
字段 更新爲對所有unpaid = 0
爲true。
代碼:
db.items.update({
"unpaid": {
$gte: 500
}
}, {
$inc: {
"unpaid": -500
}
});
db.items.update({
"unpaid":0,"paid":false
}, {
$set: {
"paid": true
}
});
這種方法可能不適合,如果原子更新應用程序中的關係,以及可能導致增加額外的應用程序邏輯看東西的paid
領域已更新之前正確。
第二種方法,包括:
- 與
unpaid >= 500
找到的所有記錄。
- 執行bulk更新。每次更新將同時設置
unpaid
和 ,paid
字段。
代碼:
var bulk = db.items.initializeUnorderedBulkOp();
db.items.find({"unpaid":{$gte:500}}).forEach(function(doc){
var unpaid = doc.unpaid-500;
var update = {$set:{"unpaid":unpaid}};
if(unpaid <= 0){
update.$set["paid"] = true;
}
bulk.find({"_id":doc._id }).update(update);
})
bulk.execute();
不,這兩個查詢。兩種不同的情況導致兩個不同領域的更新。 –