Parse.com大于返回重复项

时间:2014-07-25 14:50:07

标签: php parse-platform

我使用此PHP parse.com API library 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'];
}

我使用whereNotEqualTo('objectId', '');限制作为库中错误的解决方法,实际上检索了所有行,而skip参数在一批1000行中检索它们

Parse 的另一个限制是它不允许skip大于10.000。所以我使用第一个10.000批次中最后一行的updatedAt字段作为下一行的限制。

在前10.000行之后,它调用whereGreaterThan方法,在内部添加gt (大于) Parse 参数 curl 请求。

问题是在第二个循环步骤中,它返回与上一步中最后一行相同的行,当我尝试将它们插入数据库时​​,我得到重复objectId的错误。 / p>

所以数组看起来像这样:

// 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', ...);

9999th和10000th,其余属性相等,所以我确定它是 Parse 检索两次的同一行。

我不明白为什么会这样做,因为它也有whereGreaterThanOrEqualTo方法,使用gte (大于或等于) Parse 参数。

TL; DR

大于 gt参数的行为与大于或等于 完全相同({{1} })参数。

1 个答案:

答案 0 :(得分:1)

这可能会解决您的问题。更改代码的这一部分:

if($skip === 10000) {
    $lastUpdated = $parseAllResults[$index]['updatedAt'];

    $skip = 0;
}

为:

if($skip === 10000) {
    $lastUpdated = $parseAllResults[$index]['updatedAt'];

    $skip = 1;
}