2012-02-08 41 views
0

关于原子性和隔离性的Mongo文档有点含混并且有点混乱。我有这个文档结构,我想确保mongo处理更新,同时隔离来自不同用户的更新。在更新单个文档时,Mongo确保隔离吗?

假设产品折扣优惠的集合。当用户兑换优惠时,offers_redeemed字段将递增。 max_allowed_redemptions字段控制报价可以兑换的次数。

{ 
    offer_id: 99, 
    description: “Save 25% on Overstock.com…” 
    max_allowed_redemptions: 10, 
    offers_redeemed: 3 
} 

我测试了使用findAndModify,看来通过更新只有在另外的赎回会小于或等于允许最大报价工作;我想知道这是否是正确的方法,如果这可以在多用户,分散的环境中工作。是否有更新到offers_redeemed会强制超过max_allowed_redemptions?显然,这会破坏记录,所以我们需要避免它。

db.offer.findAndModify({ 
    query:{ offer_id: 99, $where: “this.offers_redeemed + 1 <= this.max_allowed_redemptions”}, 
    update: {$inc: {offers_redeemed: 1}, 
    new: true }) 

回答

2

首先,如文档很清楚说

如果您不需要返回文档,你可以使用更新(这可能会影响多个文档,以及)。

其次,在原子页面上观看Update if Current策略。它清楚地表明,如果条件适用,那么更新就会发生,两者之间什么都不会发生。

+0

不知道我错过了文档中的那个页面,但这是一个完美的例子,thx – raffian 2012-02-08 21:04:35