我有一个(当前)1567个对象的类。它们是我从网站的RSS源解析的文章的网址,标题和发布日期。云作业是周期性的,因此对象不断增加。虽然我检查了beforesave中的唯一性,但有时会出现一些重复的项目,大约10%的对象是重复的。
我一直在尝试删除这些重复项,并希望创建一个可以立即获取所有对象的查询逻辑。查询的最大限制为1000.我提到this question on Parse Help,并尝试将其转换为JavaScript云代码。
Parse.Cloud.job("DeleteDuplicate", function(request, status) {
var query = new Parse.Query(NewsArticle);
var allObjectArray= [];
var limit = 1000;
var skip = 0;
var repeat = true;
query.limit(limit);
query.skip(skip);
do{
query.find({
success: function(results) {
allObjectArray.push(results.concat());
if(results.length === limit){
skip = skip+limit;
query.skip(skip);
repeat = true;
console.log("true");
}else{
repeat = false;
console.log("false");
}
console.log("Successfully retrieved " + results.length);
},
error: function(error) {
alert("Error: " + error.code + " " + error.message);
status.error("Error: " + error.code + " " + error.message);
}
});
}while(repeat);
status.success("final length "+allObjectArray.length);
});
代码失败,作业状态为“无法连接到Cloud Code ”。我认为它会进入无限循环并在2-3分钟后超时。如果有人可以提供帮助,那就太棒了。
编辑:可以使用Promise
帮助吗?
编辑2:现在尝试承诺 -
Parse.Cloud.job("jobFindAll", function(request, status) {
var query = new Parse.Query(NewsArticle);
var allObjectArray= [];
var limit = 1000;
var skip = 0;
var repeat = false;
query.limit(limit);
query.skip(skip);
var promiseList = [];
console.log("in job");
query.find().then(function(results) {
console.log("results.length "+results.length);
allObjectArray = results.slice();
console.log("allObjectArray.length "+allObjectArray.length);
if(results.length === limit){
console.log("smaller");
skip = skip+limit;
do{
console.log("first repeat = "+repeat);
promiseList.push(functionFindAll(allObjectArray, limit, skip));
console.log("promiseList - "+promiseList);
repeat = promiseList[promiseList.length-1];
console.log("looping repeat = "+repeat);
}while(repeat);
return Parse.Promise.when(promiseList);
}else{
console.log("longer");
}
}).then(function(){
console.log("in then");
status.success("final length "+allObjectArray.length);
}, function(error) {
status.error("Error: " + error.code + " " + error.message);
}
);
});
function functionFindAll(allObjectArray, limit, skip){
var returnPromiseList = [];
var query_new = new Parse.Query(NewsArticle);
query_new.limit(limit);
query_new.skip(skip);
query_new.find().then(function(results) {
console.log("function results.length "+results.length);
if(results.length === limit){
skip = skip+limit;
query.skip(skip);
allObjectArray.push(results.concat());
console.log("true in function");
return Parse.Promise.as(true);
}else{
allObjectArray.push(results.concat());
return Parse.Promise.as(false);
console.log("false in function");
}
},
function(error) {
console.log("Error: " + error.code + " " + error.message);
return Parse.Promise.as("ERROR!");
}
);
console.log("below "+allObjectArray.length);
}
现在代码没有进入query_new.find()。函数中的日志消息不会出现,直接显示消息“下面....”。
答案 0 :(得分:15)
以下代码将查找该类中的所有项目,它不使用skip,因为parse.com有另一个极限限制调用"unable to skip more than 10000 items"
。它跳过使用objectId。
Parse.Cloud.job("findAll", function(request, status) {
var result = [];
var processCallback = function(res) {
result = result.concat(res);
if (res.length === 1000) {
process(res[res.length-1].id);
return;
}
// do something about the result, result is all the object you needed.
status.success("final length " + result.length);
}
var process = function(skip) {
var query = new Parse.Query("NewsArticle");
if (skip) {
console.log("in if");
query.greaterThan("objectId", skip);
}
query.limit(1000);
query.ascending("objectId");
query.find().then(function querySuccess(res) {
processCallback(res);
}, function queryFailed(reason) {
status.error("query unsuccessful, length of result " + result.length + ", error:" + error.code + " " + error.message);
});
}
process(false);
});
答案 1 :(得分:1)
Parse中的所有JS调用都是异步的,因此你的函数会产生无限的线程(即使它是同步的,你的query.skip(skip)
也需要进入while循环内部。
尝试将查询移出到自己的函数,该函数在成功时递归调用,直到您已读取所有对象为止。您应该能够调整此答案中的代码,这是针对类似问题的:https://stackoverflow.com/a/17268263/1176247