我的问题很普遍。我有很多用户,并希望根据他们的得分更新他们的排名位置。
所以我创建了一个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,只会更新前三个元素。
这是否有意义???
答案 0 :(得分:1)
有几个可能的原因:
无论哪种方式,将所有对象保存在一个数组中,然后调用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
}
});