繁体   English   中英

具有多个嵌套JSON密钥(PHP)的DynamoDB扫描

[英]DynamoDB Scan with multiple, nested JSON keys (PHP)

我的数据按照以下模式存储在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”元素的数据INSIDE进行扫描时, 无法获得任何匹配的条目 下面的示例代码(我正在尝试使用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文档的INSIDE值来提取数据吗? 在此先感谢您的任何建议!

编辑

我已经尝试过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',
        ),
    ),
));

解决我的问题的方法:

$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看来,这是可能的,但我从未真正尝试过。 但这绝对不是正确的语法。 查看即将推出的适用于PHP的AWS开发工具包版本3Scan API文档 (由于某些技术限制,版本2文档不包括最新的DynamoDB功能)。 您将需要使用嵌套的AttributeValueList参数。 您可能还想在DynamoDB官方论坛上对此进行询问。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM