如何检查在dynamodb中设置的字符串中是否存在字符串

时间:2014-06-12 09:25:41

标签: php amazon-dynamodb

我的表中的每个项目都设置了一个字符串。例如,

{                                        
   Title = "Book 101 Title"
   ISBN = "111-1111111111"
   Authors = "Author 1"
   Price = -2
   Dimensions = "8.5 x 11.0 x 0.5"
   PageCount = 500
   Color = [ "Red", "Black" ]
   ProductCategory = "Book" 
}


{                                        
   Title = "Book 102 Title"
   ISBN = "222-222222222"
   Authors = "Author 2"
   Price = -8
   Dimensions = "8.5 x 11.0 x 0.5"
   PageCount = 700
   Color = [ "Red", "Green" ]
   ProductCategory = "Book" 
}

使用dynamoDB php sdk,我想获得“红色”颜色的项目。我试试这个。

$response = $client->query(array(
    "TableName" => $tablename,
    "KeyConditions" => array(
        "ComparisonOperator" => ComparisonOperator::CONTAINS,
        'Color' => array(
            'AttributeValueList' => array(
                array(Type::STRING_SET => array("Red"))
        ),
     )
));

但是我得到了这样的错误。

ValidationException: One or more parameter values were invalid: ComparisonOperator CONTAINS is not valid for SS AttributeValue type

3 个答案:

答案 0 :(得分:6)

我从aws开发者论坛here找到了一个解决方案。无法将CONTAINSquery一起使用。必须与scan一起使用。就像那样。

$response = $client->scan(array(
    "TableName" => $tablename,
    "KeyConditions" => array(
        "ComparisonOperator" => ComparisonOperator::CONTAINS,
        'Color' => array(
            'AttributeValueList' => array(
                array(Type::STRING => "Red")
        ),
     )
));

答案 1 :(得分:1)

CONTAINS运算符只能用于范围键。唯一支持的散列键运算符是EQ。

因此,在set中实现搜索的一个棘手的方法是设置一个虚拟哈希键(例如一个常量值为1的列),并设置一个索引,将该虚拟列作为哈希键,并将要搜索的集合设置为范围键。然后,您可以使用散列键值1和范围键与运算符CONTAINS进行查询。

P.S。扫描是一个非常糟糕的操作。它的效率非常低,一次最多返回1MB数据,不可预测的顺序,并可能导致吞吐量高峰。

答案 2 :(得分:-2)

我一直在阅读Amazon DynamoDB doc,我认为问题是使用ComparisonOperator::CONTAINS,我建议您改用'CONTAINS'

所以你的代码将是:

$response = $client->query(array(
    "TableName" => $tablename,
    "KeyConditions" => array(
        "ComparisonOperator" => 'CONTAINS',
        'Color' => array(
            'AttributeValueList' => array(
                array(Type::STRING_SET => array("Red"))
        ),
     )
));