【问题标题】:DynamoDB Scan with multiple, nested JSON keys (PHP)使用多个嵌套 JSON 键 (PHP) 进行 DynamoDB 扫描
【发布时间】:2014-12-27 23:48:45
【问题描述】:

我的数据存储在 DynamoDB 中的单个表“events”中,采用以下架构,其中“_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) 中的以下代码 - 仍然没有成功。我只能在使用主哈希/范围键和任何其他(“一级”)键进行扫描时检索,但不能像我的示例中那样使用来自文档(地图/列表)内部的键。见下文:

$iterator = $client->getIterator('Scan', array(
    'TableName' => 'events',
    'ScanFilter' => array(
        'data' => array(
            'AttributeValueList' => array(
                array(
                    'M' => array(
                        'name' => array("S"=>"Jeff"),
                    ),
                ),
            ),
            'ComparisonOperator' => 'EQ',
        ),
    ),
));

【问题讨论】:

    标签: php json amazon-web-services amazon-dynamodb


    【解决方案1】:

    我的问题的解决方案:

    $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 看来,这似乎是可行的,但我从未真正尝试过。这绝对是 not 正确的语法。查看Scan API docs for the upcoming Version 3 of the AWS SDK for PHP(由于一些技术限制,版本 2 文档不包括最新的 DynamoDB 功能)。您将需要使用嵌套的AttributeValueList 参数。您可能还想在official DynamoDB forum 上询问此问题。

    【讨论】:

    • 您好杰里米,谢谢您的回复。我使用 sdk 版本 2.7.0 和 2.7.2 尝试了你的建议(见上面的编辑)。我不确定我编辑的代码是否仍然存在一些语法问题,但我没有从 sdk 中得到任何错误(类似于扫描没有匹配项时的行为,但在我的情况下应该有几个匹配项)。再次感谢您的帮助!
    • 按照您的建议,我刚刚在官方 DynamoDB 论坛上发布了这个问题。作为参考,我还在此处提供了一个链接:forums.aws.amazon.com/thread.jspa?threadID=164470 - 如果我在那里得到任何更新,我将在此处报告有关 stackoverflow 的更多信息。
    • 该死的,好吧,我会试试这个星期一能不能得到更多的信息。如果您最终在 DynamoDB 论坛上发帖,请务必在此处添加帖子链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多