我使用此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 参数。
大于 (gt
)参数的行为与大于或等于 完全相同({{1} })参数。
答案 0 :(得分:1)
这可能会解决您的问题。更改代码的这一部分:
if($skip === 10000) {
$lastUpdated = $parseAllResults[$index]['updatedAt'];
$skip = 0;
}
为:
if($skip === 10000) {
$lastUpdated = $parseAllResults[$index]['updatedAt'];
$skip = 1;
}