我有一个 Book 模型,它具有 upVotes 属性。 Book 实例可以从数据库(MongoDB)中查询,修改,然后保存。如果用户为一本书点赞,我会更新 upVotes 计数,并将整个模型保存回服务器。

问题是,如果在加载实例的时间和保存实例的时间之间有其他人投票,那么这两票将被保存为一票。我需要的是一种简单的方法来说“将模型增加 1 个服务器端”,而不是“将模型增加 1 个客户端并希望不会发生冲突”。

最佳答案

您不必为了更改一件事而将整个模型保存到服务器,您可以(并且在这种情况下应该)向您的模型添加一个 upVote 方法,该方法对您的服务器执行“增加投票”AJAX 调用。在你的模型中,你会有这样的东西:

upVote: function() {
    var self = this;
    $.ajax({
        url: '/some/upvote/path',
        type: 'POST',
        success: function(data) {
            self.set('upVotes', data.upVotes);
        },
        // ...
    });
}

然后 View 将使用它来处理 upvote 操作:
upVote: function() {
    // Highlight the upvote button or provide some other feedback that
    // the upvote has been seen.
    this.model.upVote();
}

并且您可能在模型的 upVotes 属性上有一个更改事件的监听器,以正确增加显示的投票计数器(如果您有这样的东西)。

此外,您在服务器上的 /some/upvote/path 只会将 $inc update 发送到 MongoDB 中,以避免在您的服务器上出现相同的“同时发生两件事”的问题。如果您使用的是关系数据库,您最终会想要做类似 update t set upvotes = upvotes + 1 where id = ? 的事情。

对于简单的增量操作,不需要在客户端或服务器上进行“查询、更新、保存”往返。相反,将增量视为单个增量操作,并将该增量一直推送到最终的持久数据存储层。

关于mongodb - 带有 Backbone.js 的投票系统,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8689027/

10-10 10:51