我正在尝试获取所有用户数据,并按年龄降序排序,然后为每个人修改年龄。但是当我使用query.find()
时,它完成得太快了。只有前2或3位年龄的用户才能正确保存。然后我尝试使用query.each()
,但它不能按降序运行。
以下是我使用query.each()时的代码,如果我没有订购它,它会正确保存所有用户,但我需要订购它们并根据订单更改它们的年龄。
Parse.Cloud.job("ChangeUserAge", function(request, status) {
Parse.Cloud.useMasterKey();
var counter = 0;
var query = new Parse.Query(Parse.User);
query.descending("age, name");
query.each(function(user) {
counter += 1;
user.set("age", counter);
return user.save();
}).then(function() {
// Set the job's success status
status.success("ChangeUserAge completed successfully.");
}, function(error) {
// Set the job's error status
status.error("ChangeUserAge went wrong.");
});
});
以下是我使用query.find()时的代码,问题是完成得太快。只有2或3个用户正确保存。
Parse.Cloud.job("RankingAllUserBasedOnDiamonds", function(request, status) {
Parse.Cloud.useMasterKey();
var query = new Parse.Query(Parse.User);
query.descending("age, name");
query.find().then(function(results) {
for(var i = 0; i < users.length; i++)
{
var user = users[i];
user.set("age", i+1);
user.save();
}
}).then(function() {
// Set the job's success status
status.success("ChangeUserAge completed successfully.");
}, function(error) {
// Set the job's error status
status.error("ChangeUserAge went wrong.");
});
});
答案 0 :(得分:5)
经过几个小时的研究和测试。最后找到一种更新.find()中所有对象的方法。它是Parse.Object.saveAll
。我将所有需要更新的对象推送到一个数组中,然后使用成功和错误块调用saveAll。
但是像Fosco说的那样,只有前1000条记录被返回,所以我用一个起始索引参数手动运行后台作业几次。
这是我的代码:
Parse.Cloud.job("RankingAllUserBasedOnDiamonds", function(request, status) {
Parse.Cloud.useMasterKey();
var usersToSave= [];
var query = new Parse.Query(Parse.User);
query.descending("age, name");
query.find().then(function(results) {
for(var i = 0; i < users.length; i++)
{
var user = users[i];
user.set("age", i+1);
usersToSave.push(user);
}
}).then(function() {
Parse.Object.saveAll(usersToSave, {
success: function(list) {
// All the objects were saved.
if (status) {
status.success("Update completed successfully.");
};
console.log("saveInBackground success");
}, error: function(model, error) {
// An error occurred while saving one of the objects.
if (status) {
status.error(error);
};
console.log("saveInBackground error: " + error.message);
});
}, function(error) {
// Set the job's error status
status.error("ChangeUserAge went wrong.");
});
});
希望可以帮助某人有同样的问题。
答案 1 :(得分:1)
假设您的用户数少于1,000,您可以使用promises等到他们在结束工作前完成保存:
query.find().then(function(results) {
var promises = [];
for(var i = 0; i < users.length; i++)
{
var user = users[i];
user.set("age", i+1);
promises.push(user.save());
}
return Parse.Promise.when(promises);
}).then(function() {
// Set the job's success status
status.success("ChangeUserAge completed successfully.");
}, function(error) {
// Set the job's error status
status.error("ChangeUserAge went wrong.");
});