1

我面临着从亚马逊 dynamodb 以降序检索记录的问题,如 mysql 中的分页限制。现在我正在使用以下脚本,但它给出了无序列表的记录。我需要最后插入的 id 位于顶部。

$limit      =   10;
$total = 0;
$start_key = null;
$params = array('TableName' => 'event','AttributesToGet' =>array('id','interactiondate','repname','totalamount','fooding','nonfooding','pdfdocument','isMultiple','payment_mode','interaction_type','products','programTitle','venue','workstepId','foodingOther','interaction_type_other'), 'ScanFilter'=> array('manufacturername' => array("ComparisonOperator" => "EQ", "AttributeValueList" => array(array("S" => "$manufacturername")))),'Limit'=>$limit );
$itemsArray = array();
$itemsArray = array();
$finalItemsArray = array(); 
$finalCRMRecords = array();
do{
if(!empty($start_key)){             
$params['ExclusiveStartKey'] = $start_key->getArrayCopy();
}
$response = $this->Amazon->Dynamodb->scan($params);     
if ($response->status == 200) {
$counter = (string) $response->body->Count;
$total += $counter;
foreach($response->body->Items as $itemsArray){
$finalItemsArray[]  =   $itemsArray;    
}
if($total>$limit){
$i =1;
foreach($response->body->Items as $items){
$finalItemsArray[]      =   $items;
if($i == $limit){
$start_key = $items->id->{AmazonDynamoDB::TYPE_NUMBER}->to_array();
$finalCRMRecords['data']    =   $finalItemsArray;
$finalCRMRecords['start_key']   =   $start_key;
break;
}
$i++;
}
}elseif($total<$limit){
$start_key = $response->body->LastEvaluatedKey->to_array();
}else{
$finalCRMRecords['data']    =   $finalItemsArray;
if ($response->body->LastEvaluatedKey) {
$start_key =$response->body->LastEvaluatedKey->to_array();
break;
} else {
$start_key = null;
}
$finalCRMRecords['start_key']   =   $start_key; 
}
}       
}while($start_key);

问候

桑迪普·库马尔·辛哈

4

1 回答 1

1

DynamoDB 中的Scan操作无法更改返回项目的排序。这也是Scan一个相当昂贵的操作,因为它总是需要读取整个表。

如果您想利用 DynamoDB,这里有一个建议:

与其寻找信息,不如试着找到它。

从某种意义上说,使用查找而不是扫描/查询来获取您需要的信息。

例如,如果您有一个存储Events的表。只需将所有事件存储在该表中,其EventIdHashKey. 然后你可以有第二个表EventLookups来存储对EventIds的查找。在EventLookups表中,您可以放一个ItemlikeLookupId: LATEST-EVENT引用 some EventId: ...。每次插入新事件时,您都可以更新LATEST-EVENT条目以指向更新的事件。或者使用 SET 将最近的 50 个 EventIds 事件存储在一个 Item 中。

-数学

于 2013-07-17T18:55:22.917 回答