2014-12-29 66 views
1

我的目标是这样的:与条件设置操作

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

和声明:

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

当无偿将等于零,则支付领域需要也更改为真。

是否可以用一个查询来做到这一点?

+0

不,这两个查询。两种不同的情况导致两个不同领域的更新。 –

回答

0

不幸的是,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();