不幸的是,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();
不,这两个查询。两种不同的情况导致两个不同领域的更新。 –