我认为涉及NodeJs和MongoDb的代码可能会失败,如何解决?

时间:2011-03-17 06:42:08

标签: javascript node.js mongodb database

这似乎是一个普通的数据库问题,但我会在我目前的NodeJs + MongoDb上下文中提出这个问题。

假设我们有一个ID为“xyz”的通用计数器。这是获取最新计数并将其增加1的代码:

collection.find({id: "xyz"},
    function(err, currentCount) {
    collection.update({id: "xyz"},
        {$inc: {count: 1}},
        function(err, data) {
           cb(currentCount);
        }
    }
}

问题是,如果两个客户端同时尝试调用此代码,则两个客户端可能会获得相同的计数,然后集合会更新计数两次 - 这是不可取的!如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

$ inc是原子的,没有风险。它保留了不起作用的外部发现。

collection.update({id: "xyz"},
    {$inc: {count: 1}},
    function(err, data) {
       cb(data);
    }
}

很可能是你想要的。

答案 1 :(得分:0)

您可以使用findAndModify,它会修改对象并返回更新后的版本。这可以保证每个调用者的值都会增加。

collection.findAndModify( {id: 'xyz' }, ['_id'], {$inc: {count: 1}}, 
      function (err, data) {
          cb(data);
      });