У меня есть строка, установленная в каждом элементе моей таблицы. Например,
{ 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" }
С dynamDB 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
Здесь я нашел решение от форума разработчиков aws. Невозможно использовать CONTAINS
с query
. Необходимо использовать его с scan
. Как это.
$response = $client->scan(array( "TableName" => $tablename, "KeyConditions" => array( "ComparisonOperator" => ComparisonOperator::CONTAINS, 'Color' => array( 'AttributeValueList' => array( array(Type::STRING => "Red") ), ) ));
Оператор CONTAINS может использоваться только на клавише диапазона. Единственным поддерживаемым оператором для хэш-ключа является EQ.
Таким образом, сложным способом достижения поиска в наборе является установка ключа фиктивного хеша (например, столбец с постоянным значением 1) и установка индекса с этим фиктивным столбцом как хэш-ключ и набор, который вы хотите искать в качестве ключа диапазона. Затем вы можете запросить этот индекс с использованием значения хэш-ключа 1 и ключа диапазона с помощью оператора CONTAINS.
Сканирование PS – очень плохая операция. Он очень мал в эффективности, возвращая максимум 1 МБ данных за один раз, в непредсказуемом порядке и может вызвать всплеск пропускной способности.
Я читал документ Amazon DynamoDB, и я думаю, что проблема заключается в использовании ComparisonOperator::CONTAINS
, я предлагаю вам вместо этого использовать 'CONTAINS'
.
Таким образом, ваш код будет:
$response = $client->query(array( "TableName" => $tablename, "KeyConditions" => array( "ComparisonOperator" => 'CONTAINS', 'Color' => array( 'AttributeValueList' => array( array(Type::STRING_SET => array("Red")) ), ) ));