Как проверить строку в строке, заданной в 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" } 

С 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 

Solutions Collecting From Web of "Как проверить строку в строке, заданной в dynamodb"

Здесь я нашел решение от форума разработчиков 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")) ), ) ));