使用PHP SDK在DynamoDB中存储和检索嵌套的JSON

时间:2014-10-27 08:12:01

标签: php amazon-web-services amazon-dynamodb aws-php-sdk

我在DynamoDB中创建了下表:

Field1:messageId / Type:String /示例值:4873dd28-190a-4363-8299-403c535e160f

Field2:microtime /类型:数量/示例值:14143960092414

Field3:data / Type:嵌套 JSON-Array /示例值:{“foo”:“bar”,“other”:{“nested”:1}}

我正在使用PHP SDK for DynamoDB执行以下请求来创建条目

$raw = '{"foo":"bar","other":{"nested":1}}';
$result = $client->putItem(array(
    'TableName' => 'requests2',
    'Item' => array(
        'messageId'   => array('S' => '4873dd28-190a-4363-8299-403c535e160f'),
        'microtime' => array('N' => microtime(true)*10000),
        'data'   => array('S' => $raw),
    )
));

然后我想查询表并使用JSON数组数据字段中的变量进行过滤。我的上述解决方案是以正确的方式输入数据吗?根据我的理解,JSON数组存储为字符串。我们需要另一种数据类型吗?基本上,我可以像下面一样查询表来检索在最后一分钟内添加的消息:

$iterator = $client->getIterator('Query', array(
    'TableName'     => 'requests2',
    'KeyConditions' => array(
        'messageId' => array(
            'AttributeValueList' => array(
                array('S' => '4873dd28-190a-4363-8299-403c535e160f')
            ),
            'ComparisonOperator' => 'EQ'
        ),
        'microtime' => array(
            'AttributeValueList' => array(
                array('N' => strtotime("-1 minutes")*10000)
            ),
            'ComparisonOperator' => 'GT'
        )
    )
));

foreach ($iterator as $item) {
    echo $item['messageId']['S']." ";
}

但是如何修改我的请求以允许通过数据字段中的任何值进行查询?例如,仅按 [数据] [其他] [嵌套] = 1

的人进行过滤

我在这个问题上花了过去几个小时,我无法让它工作......我非常感谢任何提示,提前谢谢!

2 个答案:

答案 0 :(得分:0)

我认为用于DynamoDB的AWS PHP SDK尚未实现对基于JSON的文档存储的支持。他们的recent notification于2014年10月8日在他们的博客上发表,提到了仅在Java,.NET,Ruby和JS SDK中支持这一新功能。

答案 1 :(得分:0)

我知道这是在2014年发布的,但是我一直在寻找这个答案,因此,我希望将搜索结果分享给将来会遇到此问题的任何人。

最佳实践是将JSON作为字符串存储,但是使用Marshaler对象将JSON转换为DynamoDB可以消化的东西,并且您也可以查询:

使用marshalJSON方法打开一个JSON,如您在本亚马逊link

中所见

对于那些正在寻找快速示例的人,我在此处添加了该过程的关键部分:

如果您有如下所示的JSON

{
  "id": "5432c69300594",
  "name": {
    "first": "Jeremy",
    "middle": "C",
    "last": "Lindblom"
  },
  "age": 30,
  "phone_numbers": [
    {
      "type": "mobile",
      "number": "5555555555",
      "preferred": true
    },
    {
      "type": "home",
      "number": "5555555556",
      "preferred": false
    }
  ]
} 

存储在字符串变量$json中,您可以轻松完成

use AwsDynamoDbDynamoDbClient;
use AwsDynamoDbMarshaler;

$client = DynamoDbClient::factory(/* your config */);
$marshaler = new Marshaler();

$client->putItem([
    'TableName' => 'YourTable',
    'Item'      => $marshaler->marshalJson($json)
]);