Php Parse.com大于返回的重复项
我使用它从Parse中检索表中的行 由于每个请求最多1000行的限制,我在for循环中检索它们,如下所示:Php Parse.com大于返回的重复项,php,parse-platform,Php,Parse Platform,我使用它从Parse中检索表中的行 由于每个请求最多1000行的限制,我在for循环中检索它们,如下所示: $lastUpdated = null; $parse = new parseQuery($tableName); $parseAllResults = array(); $skip = 0; do { $index = count($parseAllResults) - 1; if($skip === 10000) { $lastUpdated =
$lastUpdated = null;
$parse = new parseQuery($tableName);
$parseAllResults = array();
$skip = 0;
do {
$index = count($parseAllResults) - 1;
if($skip === 10000) {
$lastUpdated = $parseAllResults[$index]['updatedAt'];
$skip = 0;
}
$parseResults = queryParseCrawlObjects($lastUpdated, $skip);
if (!empty($parseResults)) {
$skip += 1000;
} else {
$skip = 0;
}
$parseAllResults = array_merge($parseAllResults, $parseResults);
} while ($skip > 0);
function queryParseCrawlObjects($parse, $lastUpdated, $skip) {
global $parse;
date_default_timezone_set('UTC');
$parse->orderBy('updatedAt');
if ($lastUpdated != null) {
$parse->whereGreaterThan('updatedAt', $parse->dataType('date', $lastUpdated));
} else {
$parse->whereNotEqualTo('objectId', '');
}
$parse->setLimit(1000);
$parse->setSkip($skip);
$results = $parse->find();
return $results['results'];
}
// first step
$parseAllResults[0] = array('objectId' => 'ihJikHNkjH', ...);
$parseAllResults[1] = array('objectId' => 'sHJKHfddkO', ...);
...
$parseAllResults[9999] = array('objectId' => 'rukBfcaDFR', ...);
// second step
$parseAllResults[10000] = array('objectId' => 'rukBfcaDFR', ...);
$parseAllResults[10001] = array('objectId' => 'gusFGvQWVs', ...);
...
$parseAllResults[19999] = array('objectId' => 'asHppNVAaD', ...);
我使用的是whereNotEqualTo('objectId','')代码>限制作为库中bug的一种解决方法,它实际上检索所有行,而skip
参数ro则检索1000行中的所有行
Parse的另一个限制是它不允许大于10.000的skip
。因此,我使用前10000批中最后一行的updatedAt
字段作为下一行的限制
在前10.000行之后,它调用whereGreaterThan
方法,该方法在内部向curl请求添加gt
(大于)Parse参数
问题在于,在第二个循环步骤中,它返回的行与前一个步骤中的最后一行相同,当我尝试将它们插入数据库时,我得到了duplicateobjectId
的错误
因此,数组看起来像这样:
$lastUpdated = null;
$parse = new parseQuery($tableName);
$parseAllResults = array();
$skip = 0;
do {
$index = count($parseAllResults) - 1;
if($skip === 10000) {
$lastUpdated = $parseAllResults[$index]['updatedAt'];
$skip = 0;
}
$parseResults = queryParseCrawlObjects($lastUpdated, $skip);
if (!empty($parseResults)) {
$skip += 1000;
} else {
$skip = 0;
}
$parseAllResults = array_merge($parseAllResults, $parseResults);
} while ($skip > 0);
function queryParseCrawlObjects($parse, $lastUpdated, $skip) {
global $parse;
date_default_timezone_set('UTC');
$parse->orderBy('updatedAt');
if ($lastUpdated != null) {
$parse->whereGreaterThan('updatedAt', $parse->dataType('date', $lastUpdated));
} else {
$parse->whereNotEqualTo('objectId', '');
}
$parse->setLimit(1000);
$parse->setSkip($skip);
$results = $parse->find();
return $results['results'];
}
// first step
$parseAllResults[0] = array('objectId' => 'ihJikHNkjH', ...);
$parseAllResults[1] = array('objectId' => 'sHJKHfddkO', ...);
...
$parseAllResults[9999] = array('objectId' => 'rukBfcaDFR', ...);
// second step
$parseAllResults[10000] = array('objectId' => 'rukBfcaDFR', ...);
$parseAllResults[10001] = array('objectId' => 'gusFGvQWVs', ...);
...
$parseAllResults[19999] = array('objectId' => 'asHppNVAaD', ...);
第9999行和第100000行的其余属性相等,因此我确信它是两次检索到的Parse中的同一行
我不明白它为什么会这样做,因为它还有一个方法,使用gte
(大于或等于)Parse参数,它的where大于或等于方法
TL;博士
大于(gt
)参数的行为与大于或等于(gte
)参数的行为完全相同。这可能会解决您的问题。更改代码的这一部分:
if($skip === 10000) {
$lastUpdated = $parseAllResults[$index]['updatedAt'];
$skip = 0;
}
致:
好吧,这更像是一个变通办法,虽然它有效,但不能回答我的问题