1

我有一个“单词”表,我想做的是,如果用户使用该单词,则将其插入表中。但是,如果它已经存在,请更新该单词的计数。

我看不到将列实际设置为唯一的方法。也就是说,我如何避免竞争条件:

t1 - user1 检查是否使用了“Love”。NO t2 - user2 检查是否使用了“Love”。NO t3 - user1 添加“Love” t4 - user2 添加“Love”

我不希望它在数据库中出现两次。无论如何要在 Parse 中完成这个?

4

2 回答 2

4

为避免竞争条件,您应该使列/字段唯一。在与 Parse 一起使用的数据库中执行此操作(如果您将 mongoDB 与解析服务器一起使用,那么这里是 mongoDB 的链接,例如 - https://docs.mongodb.com/manual/core/index-unique/)。然后在 CloudCode 中 - 尝试创建一个新的单词对象并存储它。如果单词已经存在,则存储将失败,然后您可以使用查询来查找现有单词并改为递增。

于 2018-03-20T20:55:54.650 回答
1

您可以使用“存在”查询来检查具有键集的对象:

var Word = Parse.Object.extend("words");
var query = new Parse.Query(Word);
query.exists("Love");
query.find({
  success: function(results) {
    if(results.length === 0){
      // Insert a new word object with the 'Love' key set to 1
      var newWord = new Word();
      newWord.set('Love', 1);
      newWord.save(null, {
        success: function(newWord) {
          alert('New object created with objectId: ' + newWord.id);
        },
        error: function(newWord, error) {
          alert('Failed to create new object, with error code: ' + error.description);
        }
      });
    } else {
      // Get the existing word object and increment its 'Love' key by 1
      var existingWord = results[0];
      var currCount = existingWord.get('Love');
      existingWord.set('Love', currCount + 1);
      existingWord.save(null, {
        success: function(existingWord) {
          alert('Existing object saved with objectId: ' + newWord.id);
        },
        error: function(existingWord, error) {
          alert('Failed to save existing object, with error code: ' + error.description);
        }
      });
    }
  },
  error: function(error) {
    alert("Error: " + error.code + " " + error.message);
  }
});

关于防止竞争条件,您可以使用Parse Cloud Code处理此问题。你可以有一个处理数据输入的云函数,它应该按顺序处理请求。

于 2013-10-03T07:10:34.163 回答