2014-10-31 4 views
2

내 데이터는 "_id"를 해시 키로, "마이크로 시간"을 범위 키로 사용하는 다음 스키마의 DynamoDB에서 "이벤트"단일 테이블 "이벤트"에 저장됩니다 (아래 예제 데이터) : 나는 (이 예, 주 해시 키 "_id"에서) 내 필터를 기반으로 데이터베이스를 검색하기 위해 AWS PHP SDK 2.7.0을 사용하고다중 중첩 JSON 키 (PHP)

{ 
    "_id": { 
    "S": "ae3761b5-b73b-4fb9-ae5a-5cc230b8fa11" 
    }, 
    "data": { 
    "M": { 
     "name": { 
     "S": "Jeff" 
     }, 
     "purchase_value": { 
     "N": "25" 
     }, 
     "user_id": { 
     "N": "1201" 
     } 
    } 
    }, 
    "microtime": { 
    "N": "14147568808639" 
    } 
} 

. 나는 "데이터"요소 내부 데이터를 기반으로, 내가 일치하는 항목를 얻을 수 없다 스캔 할 때 지금

$client = DynamoDbClient::factory(array(
       'key' => 'key', 
       'secret' => 'secret', 
       'region' => 'eu-west-1' 
)); 

$iterator = $client->getIterator('Scan', array(
    'TableName' => 'events', 
    'ScanFilter' => array(
     '_id' => array(
      'AttributeValueList' => array(
       array('S' => "ae3761b5-b73b-4fb9-ae5a-5cc230b8fa11") 
      ), 
      'ComparisonOperator' => 'EQ' 
     ), 
    ) 
)); 

foreach ($iterator as $item) { 
    print_r($item); 
} 

: 그 아래에 내 코드는 완벽하게 (반환 올바른 항목)를 작동합니다.

$iterator = $client->getIterator('Scan', array(
    'TableName' => 'events', 
    'ScanFilter' => array(
     'data.name' => array(
      'AttributeValueList' => array(
       array('S' => "Jeff") 
      ), 
      'ComparisonOperator' => 'EQ' 
     ), 
    ) 
)); 

foreach ($iterator as $item) { 
    print_r($item); 
} 

누군가 내 코드와 함께 문제를 볼 수 있습니다, 또는 내부의 값을 비교하여 데이터를 추출하는 사실 그것은 불가능하다 : 아래의 예제 코드 (I 제프 data.name 모든 추출 =하려합니다) JSON 문서? 미리 제안 해 주셔서 감사합니다. 내가 DynamoDB의 PHP SDK 문서 (http://docs.aws.amazon.com/aws-sdk-php/v3/api/Aws/DynamoDb/dynamodb-2012-08-10.html#scan)에서 다음 코드를 시도했습니다

편집 - 여전히 성공. 필자는 기본 해시/범위 키 및 다른 ("첫 번째 수준") 키를 사용하여 검색 할 때만 검색 할 수 있지만 필자의 예와 같이 문서 (지도/목록)의 내부에서 키를 사용하지는 않습니다. 아래를 참조하십시오 :

$iterator = $client->getIterator('Scan', array(
    'TableName' => 'events', 
    'ScanFilter' => array(
     'data' => array(
      'AttributeValueList' => array(
       array(
        'M' => array(
         'name' => array("S"=>"Jeff"), 
        ), 
       ), 
      ), 
      'ComparisonOperator' => 'EQ', 
     ), 
    ), 
)); 

답변

2

해결 방법 : 여기

$iterator = $client->getIterator('Scan', array(
    'TableName' => 'event_test2', 
    'FilterExpression' => 'event.customer_name = :filter', 
    "ExpressionAttributeValues" => array(":filter"=>array("S"=>"Jeff")), 
)); 

더 많은 정보 : https://forums.aws.amazon.com/thread.jspa?threadID=164470

+1

마샬 러를 사용하여 데이터 유형에 두통을 피할 수 있습니다. http://docs.aws.amazon.com/aws-sdk-php/v2/api/class-Aws.DynamoDb.Marshaler.html – tsuz

1

API에서 가능하지만 실제로 시도한 적이 없습니다. 그것은 정확하게 이 아니고 올바른 구문입니다. Scan API docs for the upcoming Version 3 of the AWS SDK for PHP (일부 기술적 제한 사항으로 인해 버전 2 문서에는 최신 DynamoDB 기능이 포함되지 않음)을 참조하십시오. 중첩 된 AttributeValueList 매개 변수를 사용해야합니다. official DynamoDB forum에서 이에 관해 문의 할 수도 있습니다. 내 문제에

+0

안녕 제레미, 당신의 답장을 보내 주셔서 감사합니다. 나는 당신의 제안을 (위의 편집을 참조하십시오) sdk 버전 2.7.0과 2.7.2를 사용해 보았습니다. 편집 된 코드에 여전히 구문 문제가 있는지 확실하지 않지만 sdk에서 오류가 발생하지 않습니다 (유사한 동작의 경우에는 일치가 있지만 내 경우에는 여러 일치가 있어야 함). 도와 주셔서 다시 한 번 감사드립니다! –

+0

제안한대로이 질문을 공식 DynamoDB 포럼에 게시했습니다. 참고로 여기에 링크도 포함되어 있습니다 : https://forums.aws.amazon.com/thread.jspa?threadID=164470 - 거기에 어떤 업데이트가 있으면, 여기에 더 많은 정보가있는 stackoverflow가 있습니다. –

+1

젠장, 이번 월요일에 좀 더 자세한 정보를 얻을 수 있는지 알아 보겠습니다. DynamoDB 포럼에 게시가 끝나면 여기에 게시물에 대한 링크를 추가하십시오. –