我的对象如下:
{
_id: ObjectId(),
unpaid: 500,
paid: false
}
和声明:
db.items.update({
unpaid: {
$gte: 500
}
}, {
$inc: {
unpaid: -500
}
});
当未付款等于零时,付费字段也需要更改为真。
是否可以使用一个查询执行此操作?
答案 0 :(得分:0)
不幸的是,MongoDB
查询不够灵活,无法触发查询后事件。您可以通过两种方式完成此操作,但两者都涉及触发多个查询:
第一种方法涉及:
unpaid >= 500
中查找和更新所有记录
更新声明。paid
字段的更新语句
对所有unpaid = 0
都是真实的。代码:
db.items.update({
"unpaid": {
$gte: 500
}
}, {
$inc: {
"unpaid": -500
}
});
db.items.update({
"unpaid":0,"paid":false
}, {
$set: {
"paid": true
}
});
如果原子更新在您的应用程序中很重要,这种方法可能不合适,并且可能会导致添加额外的应用程序逻辑,以便在paid
字段更新之前正确查看内容。
第二种方法涉及:
unpaid >= 500
。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();