(현재) 1567 개체가있는 클래스가 있습니다. 웹 사이트의 RSS 피드에서 구문 분석 한 기사의 URL, 제목 및 게시 날짜입니다. 클라우드 작업은 주기적이므로 개체가 계속 증가합니다. beforesave에서 고유성을 확인했지만, 때때로 일부 중복 항목이 나타나고 개체의 약 10 %가 중복됩니다.
나는 이러한 중복을 삭제하는 작업을 시도해 왔으며 모든 개체를 한 번에 가져올 수있는 쿼리 논리를 만들고 싶습니다. 쿼리의 최대 제한은 1000입니다. 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);
});
작업 상태가 " 클라우드 코드에 연결할 수 없음 "으로 코드가 실패합니다 . 나는 그것이 무한 루프로 가고 2-3 분 후에 시간 초과된다고 생각합니다. 누구든지 도울 수 있다면 좋을 것입니다.
편집 : Promise
도움을 사용할 수 있습니까?
편집 2 : 지금 Promise를 시도했습니다-
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 ()를 입력하지 않습니다. 기능의 로그 메시지가 나타나지 않고 바로 "아래 ...."메시지가 나타납니다.
다음 코드는 클래스의 모든 항목을 찾습니다. parse.com에는 또 다른 이상한 제한 호출이 있기 때문에 skip을 사용하지 않습니다 "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);
});
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다