Мои данные хранятся в одной таблице «события» в DynamoDB в следующей схеме с «_id» как хэш-ключ и «microtime» в качестве ключа диапазона (примерные данные ниже):
{ "_id": { "S": "ae3761b5-b73b-4fb9-ae5a-5cc230b8fa11" }, "data": { "M": { "name": { "S": "Jeff" }, "purchase_value": { "N": "25" }, "user_id": { "N": "1201" } } }, "microtime": { "N": "14147568808639" } }
Я использую AWS PHP SDK 2.7.0 для сканирования базы данных на основе моих фильтров (в этом примере основной хэш-ключ «_id»). Мой код ниже работает отлично ( возвращает правильную запись ):
$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); }
теперь, когда я пытаюсь выполнить сканирование на основе данных INSIDE элемента «data», я не могу получить соответствующие записи . Пример кода ниже (я пытаюсь извлечь все с data.name = Jeff):
$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); }
Кто-нибудь может видеть какие-либо проблемы с моим кодом или на самом деле невозможно извлечь данные, сравнивая значения INSIDE документа JSON? Спасибо заранее за любые предложения!
РЕДАКТИРОВАТЬ
Я пробовал следующий код из документации DynamicDB PHP SDK ( http://docs.aws.amazon.com/aws-sdk-php/v3/api/Aws/DynamoDb/dynamodb-2012-08-10.html#scan ) – до сих пор нет успеха . Я могу получить только при сканировании с использованием первичного ключа хэша / диапазона и любого другого ключа («первого уровня»), но не используя ключ из INSIDE документа (карты / списка), как в моем примере. Смотри ниже:
$iterator = $client->getIterator('Scan', array( 'TableName' => 'events', 'ScanFilter' => array( 'data' => array( 'AttributeValueList' => array( array( 'M' => array( 'name' => array("S"=>"Jeff"), ), ), ), 'ComparisonOperator' => 'EQ', ), ), ));
Решение моей проблемы:
$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
Из API это кажется возможным, но я никогда не пробовал. Это, безусловно, не правильный синтаксис. Посмотрите документы Scan
API для предстоящей версии 3 AWS SDK для PHP (в документах версии 2 не указаны новейшие функции DynamoDB из-за некоторых технических ограничений). Вам нужно будет использовать вложенные параметры AttributeValueList
. Вы также можете спросить об этом на официальном форуме DynamoDB .