DynamoDB Scan с несколькими вложенными ключами JSON (PHP)

Мои данные хранятся в единой таблице «events» в 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);
}

Теперь, когда я пытаюсь сканировать на основе данных ВНУТРИ элемента «данных», Я не могу получить подходящие записи. Пример кода ниже (я пытаюсь извлечь все с 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);
}

Кто-нибудь может увидеть какие-либо проблемы с моим кодом, или на самом деле невозможно извлечь данные путем сравнения значений ВНУТРИ документа JSON? Спасибо заранее за любые предложения!

РЕДАКТИРОВАТЬ

Я пробовал следующий код из документации DynamoDB 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',
),
),
));

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

2

Другие решения

С API это кажется возможным, но я никогда не пробовал. Это определенно не правильный синтаксис, хотя. Посмотрите на Scan Документы API для будущей версии 3 пакета AWS SDK для PHP (Документы версии 2 не включают новейшие функции DynamoDB из-за некоторых технических ограничений). Вам нужно будет использовать вложенные AttributeValueList параметры. Вы также можете спросить об этом на официальный форум DynamoDB.

1