Mongodb 设置操作条件

Mongodb 设置操作条件,mongodb,mongodb-query,Mongodb,Mongodb Query,我的对象看起来像: { _id: ObjectId(), unpaid: 500, paid: false } 声明如下: db.items.update({ unpaid: { $gte: 500 } }, { $inc: { unpaid: -500 } }); 当“未支付”将等于零时,“已支付”字段也需要更改为true 是否可以通过一个查询完成此操作?不幸的是,MongoDB查询不够灵活,无法触发查询后事

我的对象看起来像:

{
   _id: ObjectId(),
   unpaid: 500,
   paid: false
}
声明如下:

db.items.update({
    unpaid: {
        $gte: 500
    }
}, {
    $inc: {
        unpaid: -500
    }
});
当“未支付”将等于零时,“已支付”字段也需要更改为true

是否可以通过一个查询完成此操作?

不幸的是,MongoDB查询不够灵活,无法触发查询后事件。您可以通过两种方式完成,但这两种方式都涉及触发多个查询:

第一种方法涉及:

查找并更新单个数据库中未付款>=500的所有记录 更新语句。 然后是另一个更新支付字段的更新语句 对于所有未付款项为true=0。 代码:

如果原子更新在您的应用程序中很重要,那么这种方法可能不适用,并且可能会导致在付费字段更新之前添加额外的应用程序逻辑以正确查看内容

第二种方法涉及:

正在查找未付款>=500的所有记录。 正在执行更新。每次更新都将设置未付和 同时支付字段。 代码:


不,这是两个问题。两种不同的情况导致两个不同字段的更新。
db.items.update({
    "unpaid": {
        $gte: 500
    }
}, {
    $inc: {
        "unpaid": -500
    }
});

db.items.update({
    "unpaid":0,"paid":false
}, {
    $set: {
        "paid": true
    }
});
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();