Expected (heredado) - Amazon DynamoDB

Expected (heredado)

nota

Le recomendamos que utilice los nuevos parámetros de expresión en lugar de estos parámetros heredados siempre que sea posible. Para obtener más información, consulte Uso de expresiones en DynamoDB. Para obtener información específica sobre el nuevo parámetro que reemplaza a este, Use ConditionExpression en su lugar..

El parámetro condicional heredado Expected es un bloque condicional para una operación UpdateItem. Expected es un mapa de pares atributo-condición. Cada entrada del mapa consta de un nombre de atributo, un operador de comparación y uno o varios valores. DynamoDB utiliza el operador de comparación para comparar el atributo con el o los valores suministrados. Para cada entrada de Expected, el resultado de la evaluación es true o false.

Si especifica más de una entrada en el mapa Expected, de forma predeterminada todas las condiciones deben evaluarse en true (verdadero). Es decir, las condiciones se combinan con el operador AND. (Si lo desea, puede usar el parámetro ConditionalOperator para definir las condiciones en OR (o). En tal caso, deberá evaluarse en true (verdadero) al menos una de las condiciones, en lugar de todas ellas).

Si el mapa Expected se evalúa en true, entonces la operación condicional se realiza correctamente; de lo contrario, se produce un error.

Expected contiene lo siguiente:

  • AttributeValueList: uno o más valores que se evaluarán respecto al atributo suministrado. El número de valores de la lista depende del valor de ComparisonOperator que se utilice.

    Para el tipo Number, las comparaciones de los valores son numéricas.

    Las comparaciones de valores String (cadena) de tipo mayor que, igual que o menor que se basan en Unicode con la codificación UTF-8 binaria. Por ejemplo, a es mayor que A y a es mayor que B.

    Al comparar valores de tipo Binary, DynamoDB trata cada byte de los datos binarios como sin signo.

  • ComparisonOperator: comparador que permite evaluar los atributos contenidos en AttributeValueList. Al realizar la comparación, DynamoDB utiliza lecturas de consistencia alta.

    Están disponibles los siguientes operadores de comparación:

    EQ | NE | LE | LT | GE | GT | NOT_NULL | NULL | CONTAINS | NOT_CONTAINS | BEGINS_WITH | IN | BETWEEN

    A continuación se indican las descripciones de cada operador de comparación.

    • EQ: igual. EQ se admite para todos los tipos de datos, incluyendo las listas y los mapas.

      AttributeValueList puede contener una sola entrada AttributeValue de tipo String (cadena), Number (número), Binary (binario), String Set (conjunto de cadenas), Number Set (conjunto de números) o Binary Set (conjunto de binarios). Si un elemento contiene una entrada AttributeValue de un tipo distinto del proporcionado en la solicitud, el valor no coincide. Por ejemplo, {"S":"6"} no es igual que {"N":"6"}. {"N":"6"} tampoco es igual que {"NS":["6", "2", "1"]}.

    • NE: distinto. NE se admite para todos los tipos de datos, incluyendo las listas y los mapas.

      AttributeValueList puede contener un solo AttributeValue de tipo String (cadena), Number (número), Binary (binario), String Set (conjunto de cadenas), Number Set (conjunto de números) o Binary Set (conjunto de binarios). Si un elemento contiene un AttributeValue de un tipo distinto del proporcionado en la solicitud, el valor no coincide. Por ejemplo, {"S":"6"} no es igual que {"N":"6"}. {"N":"6"} tampoco es igual que {"NS":["6", "2", "1"]}.

    • LE: menor o igual que.

      AttributeValueList puede contener una sola entrada AttributeValue de tipo String (cadena), Number (número) o Binary (binario) (no de tipo Set [conjunto]). Si un elemento contiene una entrada AttributeValue de un tipo distinto del proporcionado en la solicitud, el valor no coincide. Por ejemplo, {"S":"6"} no es igual que {"N":"6"}. {"N":"6"} tampoco se compara con {"NS":["6", "2", "1"]}.

    • LT : Menor que.

      AttributeValueList puede contener un solo AttributeValue de tipo String (cadena), Number (número) o Binary (binario) (no de tipo Set [conjunto]). Si un elemento contiene una entrada AttributeValue de un tipo distinto del proporcionado en la solicitud, el valor no coincide. Por ejemplo, {"S":"6"} no es igual que {"N":"6"}. {"N":"6"} tampoco se compara con {"NS":["6", "2", "1"]}.

    • GE: mayor o igual que.

      AttributeValueList puede contener una sola entrada AttributeValue de tipo String (cadena), Number (número) o Binary (binario) (no de tipo Set [conjunto]). Si un elemento contiene una entrada AttributeValue de un tipo distinto del proporcionado en la solicitud, el valor no coincide. Por ejemplo, {"S":"6"} no es igual que {"N":"6"}. {"N":"6"} tampoco se compara con {"NS":["6", "2", "1"]}.

    • GT : Mayor que.

      AttributeValueList puede contener una sola entrada AttributeValue de tipo String (cadena), Number (número) o Binary (binario) (no de tipo Set [conjunto]). Si un elemento contiene una entrada AttributeValue de un tipo distinto del proporcionado en la solicitud, el valor no coincide. Por ejemplo, {"S":"6"} no es igual que {"N":"6"}. {"N":"6"} tampoco se compara con {"NS":["6", "2", "1"]}.

    • NOT_NULL: el atributo existe. NOT_NULL se admite para todos los tipos de datos, incluyendo las listas y los mapas.

      nota

      Este operador comprueba si existe un atributo, no su tipo de datos. Si el tipo de datos del atributo “a” es null y se evalúa mediante NOT_NULL, el resultado es un valor true booleano. Este resultado se debe a que el atributo "a" existe; su tipo de datos no es pertinente para el operador de comparación NOT_NULL.

    • NULL: el atributo no existe. NULL se admite para todos los tipos de datos, incluyendo las listas y los mapas.

      nota

      Este operador comprueba la inexistencia de un atributo, no su tipo de datos. Si el tipo de datos del atributo “a” es null y se evalúa mediante NULL, el resultado es un valor false booleano. Esto se debe a que el atributo "a" existe; su tipo de datos no es pertinente para el operador de comparación NULL.

    • CONTAINS: comprueba si hay una subsecuencia, o un valor en un conjunto.

      AttributeValueList puede contener una sola entrada AttributeValue de tipo String (cadena), Number (número) o Binary (binario) (no de tipo Set [conjunto]). Si el atributo de destino de la comparación es de tipo String (cadena), entonces el operador comprueba si hay una subcadena coincidente. Si el atributo de destino de la comparación es de tipo Binary (binario), entonces el operador busca una subsecuencia del destino que coincida con la entrada. Si el atributo de destino de la comparación es un conjunto ("SS", "NS" o "BS"), entonces el operador se evalúa en true si encuentra una coincidencia exacta con cualquier miembro del conjunto.

      CONTAINS es compatible con listas: al evaluar "a CONTAINS b", "a" puede ser una lista; sin embargo, "b" no puede ser un conjunto, un mapa ni una lista.

    • NOT_CONTAINS: comprueba la ausencia de una subsecuencia, o la ausencia de un valor en un conjunto.

      AttributeValueList puede contener una sola entrada AttributeValue de tipo String (cadena), Number (número) o Binary (binario) (no de tipo Set [conjunto]). Si el atributo de destino de la comparación es de tipo String (cadena), entonces el operador comprueba la ausencia de una subcadena coincidente. Si el atributo de destino de la comparación es de tipo Binary (binario), entonces el operador busca la ausencia de una subsecuencia del destino que coincida con la entrada. Si el atributo de destino de la comparación es un conjunto ("SS", "NS" o "BS"), entonces el operador se evalúa en true si no (does not) encuentra una coincidencia exacta con cualquier miembro del conjunto.

      NOT_CONTAINS es compatible con listas: al evaluar "a NOT CONTAINS b", "a" puede ser una lista; sin embargo, "b" no puede ser un conjunto, un mapa ni una lista.

    • BEGINS_WITH: comprueba si hay un prefijo.

      AttributeValueList puede contener un solo AttributeValue de tipo String (cadena) o Binary (binario) (no de tipo Number [número] ni Set [conjunto]). El atributo de destino de la comparación debe ser un valor de tipo String o Binary (no de tipo Number ni Set).

    • IN: comprueba si hay entradas que coincidan en dos conjuntos.

      AttributeValueList puede contener una o varias entradas AttributeValue de tipo String (cadena), Number (número) o Binary (binario) (no de tipo Set [conjunto]). Estos atributos se comparan con un atributo existente de tipo Set (conjunto) de un elemento. Si cualquier entrada del conjunto de entrada está presente en el atributo del elemento, la expresión se evalúa en true.

    • BETWEEN: mayor o igual que el primer valor y menor o igual que el segundo valor.

      AttributeValueList debe contener dos entradas AttributeValue del mismo tipo, que puede ser String (cadena), Number (número) o Binary (binario) (pero no de tipo Set [conjunto]). Un atributo de destino coincide si el valor de destino es mayor o igual que la primer entrada y menor o igual que la segunda entrada. Si un elemento contiene una entrada AttributeValue de un tipo distinto del proporcionado en la solicitud, el valor no coincide. Por ejemplo, {"S":"6"} no se compara con {"N":"6"}. {"N":"6"} tampoco se compara con {"NS":["6", "2", "1"]}.

Los parámetros siguientes se pueden utilizar en lugar de AttributeValueList y ComparisonOperator:

  • Value: valor que DynamoDB compara con un atributo.

  • Exists: valor de tipo Boolean que hace que DynamoDB evalúe el valor antes de intentar la operación condicional.

    • Si Exists es true, DynamoDB verificará si el valor del atributo ya existe en la tabla. Si lo encuentra, la condición se evalúa en true; de lo contrario, la condición se evalúa en false.

    • Si Exists es false, DynamoDB presupone que el valor del atributo not (no) existe en la tabla. Si el valor no existe, entonces el supuesto es válido y la condición se evalúa en true (verdadero). Si el valor se encuentra, a pesar del supuesto de que no existía, la condición se evalúa en false.

    Tenga en cuenta que el valor predeterminado de Exists es true.

Los parámetros Value y Exists son incompatibles con AttributeValueList y ComparisonOperator. Tenga en cuenta que si utiliza los dos conjuntos de parámetros a la vez, DynamoDB devolverá una excepción ValidationException.

nota

Este parámetro no es compatible con atributos de tipo List o Map.

Use ConditionExpression en su lugar; ejemplo

Supongamos que desea modificar un elemento de la tabla Music, pero solo si se cumple una condición determinada. Podría usar una solicitud UpdateItem con un parámetro Expected como en este ejemplo de la AWS CLI:

aws dynamodb update-item \ --table-name Music \ --key '{ "Artist": {"S":"No One You Know"}, "SongTitle": {"S":"Call Me Today"} }' \ --attribute-updates '{ "Price": { "Action": "PUT", "Value": {"N":"1.98"} } }' \ --expected '{ "Price": { "ComparisonOperator": "LE", "AttributeValueList": [ {"N":"2.00"} ] } }'

Puede utilizar ConditionExpression en su lugar:

aws dynamodb update-item \ --table-name Music \ --key '{ "Artist": {"S":"No One You Know"}, "SongTitle": {"S":"Call Me Today"} }' \ --update-expression 'SET Price = :p1' \ --condition-expression 'Price <= :p2' \ --expression-attribute-values '{ ":p1": {"N":"1.98"}, ":p2": {"N":"2.00"} }'