使用Parse.com将查询中的对象限制为第一行?

时间:2014-09-20 11:50:56

标签: javascript parse-platform

我的问题很普遍。我有很多用户,并希望根据他们的得分更新他们的排名位置。

所以我创建了一个CloudCode函数,我调用它来更新其位置。我通过他们的“评分”进行查询并命令其元素。之后,我逐个获得每个元素,并更新它们的“位置”值。

代码非常简单:

Parse.Cloud.define("update_ranking", function(request, response) {
    query = new Parse.Query("Scoring");
    query.descending("scoring");
    query.find({
        success: function(results) {
            for(var i = 0; i < results.length; ++i) {
                a = results[i];
                console.log("Position of " + a.get("name") + ": " + a.get("position") + ", new position: " + i );
                a.set("position", i + 1);
                a.save();
                // a.save(null, {
                //  success: function(a) {
                //      console.log("Posicion de " + a.get("name") + ": " + a.get("position"));
                //      a.set("position", i);
                //      a.save();
                //  },
                //  error: function(a, error) {
                //      console.log('No se pudo guardar el objeto con el error: ' + error.message);
                //  }

                // });
            }
            response.success('All players updated');
        }
    });
});

令我惊讶的是,只有查询中的三个元素才能更新其位置。其余元素保留在ddbb中,位置相同。

如果我看到控制台日志:

I2014-09-20T11:37:51.331Z] Position of Fallen: 2, new position: 2
I2014-09-20T11:37:51.333Z] Position of Paco: 1, new position: 3
I2014-09-20T11:37:51.334Z] Position of Pepe: 19, new position: 6
I2014-09-20T11:37:51.334Z] Position of Dime: 12, new position: 1
I2014-09-20T11:37:51.334Z] Position of Otto: 14, new position: 12
I2014-09-20T11:37:51.336Z] Position of Rick: 16, new position: 11
I2014-09-20T11:37:51.337Z] Position of Charles: 17, new position: 15

它确实表明我正在获取数据库中的所有元素,并且他们的位置应该相应地进行更新。但是在a.save()之后并查看ddbb,只会更新前三个元素。

这是否有意义???

1 个答案:

答案 0 :(得分:1)

有几个可能的原因:

  • save()操作是异步的,但您使用response.success有效地提前完成了该功能。
  • 如果有很多保存,你可能会达到突发限制

无论哪种方式,将所有对象保存在一个数组中,然后调用Parse.Object.saveAll,应该处理它:

var toBeSaved = [];

for(var i = 0; i < results.length; ++i) {
    a = results[i];
    a.set("position", i + 1);
    toBeSaved.push(a);
}

Parse.Object.saveAll(tobeSaved, {
    success: function () {
        response.success('All players updated');
    }, error: function (err) {
        // handle error
    }
});