设置条件操作

时间:2014-12-29 17:22:25

标签: mongodb mongodb-query

我的对象如下:

{
   _id: ObjectId(),
   unpaid: 500,
   paid: false
}

和声明:

db.items.update({
    unpaid: {
        $gte: 500
    }
}, {
    $inc: {
        unpaid: -500
    }
});

当未付款等于零时,付费字段也需要更改为真。

是否可以使用一个查询执行此操作?

1 个答案:

答案 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
  • 查找所有记录
  • 执行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();