2014-12-29 102 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();