DynamoDB扫描与多个嵌套JSON键(PHP) [英] DynamoDB Scan with multiple, nested JSON keys (PHP)
问题描述
我的数据存储在一个表中的事件在DynamoDB与_id下面的模式作为哈希键和microtime中为范围键(如下示例数据):
{
_id:{
的S:ae3761b5-b73b-4fb9-ae5a-5cc230b8fa11
},
数据: {
的M:{
名称: {
S:杰夫
},
purchase_value:{
N:25
},
用户帐号: {
N:1201
}
}
},
microtime中:{
N:14147568808639
}
}
我使用的AWS PHP SDK 2.7.0扫描基于我的过滤器数据库(在这个例子中,主散列键_id)。下面是我的code完美的作品(返回正确输入):
$客户端= DynamoDbClient ::工厂(阵列(
'键'=> '键',
秘密=> '秘密',
'区域'=> 欧盟 - 西-1'
));
$迭代器= $客户 - > getIterator(扫描,阵列(
'表名'=> 事件,
ScanFilter'=>阵列(
'_id'=>阵列(
AttributeValueList'=>阵列(
阵列('S'=>中ae3761b5-b73b-4fb9-ae5a-5cc230b8fa11)
),
ComparisonOperator'=> 情商
),
)
));
的foreach($迭代器为$项){
的print_r($项目);
}
现在,当我试图根据里面的数据元素,我不能得到任何匹配条目数据进行扫描。下面的例子code(我想提取所有与data.name =杰夫):
$迭代器= $客户 - > getIterator(扫描,阵列(
'表名'=> 事件,
ScanFilter'=>阵列(
data.name'=>阵列(
AttributeValueList'=>阵列(
阵列('S'=>中杰夫)
),
ComparisonOperator'=> 情商
),
)
));
的foreach($迭代器为$项){
的print_r($项目);
}
任何人都可以看到任何问题与我的code,或者是它实际上不可能通过内部的JSON文件的比较值来提取数据?在此先感谢您的任何建议!
修改
我试着从DynamoDB PHP SDK文档以下code(的http://docs.aws.amazon.com/aws-sdk-php/v3/api/Aws/DynamoDb/dynamodb-2012-08-10.html#scan) - 的仍然没有成功强>我只能扫描使用主散列/范围键,以及任何其他(第一级)键时,但不是使用密钥从一个文件,INSIDE(地图检索/名单)就像我的例子见下图:
$迭代器= $客户 - > getIterator(扫描,阵列(
'表名'=> 事件,
ScanFilter'=>阵列(
'数据'=>阵列(
AttributeValueList'=>阵列(
阵列(
'M'=>阵列(
'名'=>阵列(S=>中杰夫),
),
),
),
ComparisonOperator'=>情商',
),
),
));
解决我的问题:
$迭代器= $客户 - > getIterator(扫描,阵列(
'表名'=> event_test2,
FilterEx pression'=> event.customer_name =:过滤器',
前pressionAttributeValues=>阵列(:过滤器=>阵列(S=>中杰夫)),
));
这里更多的信息: https://forums.aws.amazon.com/ thread.jspa?主题ID = 164470
My data is stored in a single table "events" in DynamoDB in the following schema with "_id" as hash key and "microtime" as range key (example data below):
{
"_id": {
"S": "ae3761b5-b73b-4fb9-ae5a-5cc230b8fa11"
},
"data": {
"M": {
"name": {
"S": "Jeff"
},
"purchase_value": {
"N": "25"
},
"user_id": {
"N": "1201"
}
}
},
"microtime": {
"N": "14147568808639"
}
}
I am using AWS PHP SDK 2.7.0 to scan the database based on my filters (in this example, primary hash key "_id"). My code below that works perfectly (returns correct entry):
$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);
}
now when I try to scan based on data INSIDE of the "data" element, I can't get any matching entries. Example code below (I am trying to extract all with 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);
}
Anyone can see any issues with my code, or is it in fact not possible to extract data by comparing values INSIDE of a JSON document? Thanks in advance for any suggestions!
EDIT
I've tried the following code from DynamoDB PHP SDK Documentation (http://docs.aws.amazon.com/aws-sdk-php/v3/api/Aws/DynamoDb/dynamodb-2012-08-10.html#scan) - still no success. I can only retrieve when scanning using primary hash/range key, and any other ("first-level") key, but not using a key from INSIDE of a document (map/list) like in my example. See below:
$iterator = $client->getIterator('Scan', array(
'TableName' => 'events',
'ScanFilter' => array(
'data' => array(
'AttributeValueList' => array(
array(
'M' => array(
'name' => array("S"=>"Jeff"),
),
),
),
'ComparisonOperator' => 'EQ',
),
),
));
Solution to my issue:
$iterator = $client->getIterator('Scan', array(
'TableName' => 'event_test2',
'FilterExpression' => 'event.customer_name = :filter',
"ExpressionAttributeValues" => array(":filter"=>array("S"=>"Jeff")),
));
More information here: https://forums.aws.amazon.com/thread.jspa?threadID=164470
这篇关于DynamoDB扫描与多个嵌套JSON键(PHP)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!