DynamoDB扫描与多个嵌套JSON键(PHP) [英] DynamoDB Scan with multiple, nested JSON keys (PHP)

查看:260
本文介绍了DynamoDB扫描与多个嵌套JSON键(PHP)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的数据存储在一个表中的事件在DynamoDB与_id下面的模式作为哈希键和microtime中为范围键(如下示例数据):

  {
  _id:{
    的S:ae3761b5-b73b-4fb9-a​​e5a-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-a​​e5a-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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆