我在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
的人进行过滤我在这个问题上花了过去几个小时,我无法让它工作......我非常感谢任何提示,提前谢谢!
答案 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)
]);