Php Parse.com大于返回的重复项

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 =

我使用它从Parse中检索表中的行

由于每个请求最多1000行的限制,我在for循环中检索它们,如下所示:

$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参数

问题在于,在第二个循环步骤中,它返回的行与前一个步骤中的最后一行相同,当我尝试将它们插入数据库时,我得到了duplicate
objectId
的错误

因此,数组看起来像这样:

$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;
}
致:


好吧,这更像是一个变通办法,虽然它有效,但不能回答我的问题