Escritura de condiciones con parámetros heredados - Amazon DynamoDB

Escritura de condiciones con parámetros heredados

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.

En la siguiente sección se describe cómo escribir condiciones para usarlas con parámetros heredados, tales como Expected, QueryFilter y ScanFilter.

nota

En las nuevas aplicaciones deben utilizarse parámetros de expresión en su lugar. Para obtener más información, consulte Uso de expresiones en DynamoDB.

Condiciones simples

Con los valores de los atributos, puede escribir condiciones para realizar comparaciones con los atributos de la tabla. Una condición siempre se evalúa en true o false y consta de:

  • ComparisonOperator: mayor que, menor que, igual que, etc.

  • AttributeValueList (opcional): valor o valores de atributo respecto a los que se va a establecer la comparación. Según cuál esa el operador ComparisonOperator utilizado, AttributeValueList puede contener uno, dos o más valores; o puede omitirse.

En las siguientes secciones se describen los distintos operadores de comparación, además de ejemplos de cómo utilizarlos en las condiciones.

Operadores de comparación sin valores de atributos

  • NOT_NULL: es true si un atributo existe.

  • NULL: es true si un atributo no existe.

Utilice estos operadores para verificar si un atributo existe o no. Dado que no hay ningún valor que comparar, no especifique AttributeValueList.

Ejemplo

La siguiente expresión se evalúa en true si el atributo Dimensions existe.

... "Dimensions": { ComparisonOperator: "NOT_NULL" } ...

Operadores de comparación con un valor de atributo

  • EQ: es true si un atributo es igual que un valor.

    AttributeValueList puede contener un solo valor 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 valor de un tipo distinto del especificado en la solicitud, el valor no coincide. Por ejemplo, la cadena "3" no es igual que el número 3. Tampoco el número 3 es igual que el conjunto de números [3, 2, 1].

  • NE: es true si un atributo no es igual que un valor.

    AttributeValueList puede contener un solo valor 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 valor de un tipo distinto del especificado en la solicitud, el valor no coincide.

  • LE: es true si un atributo es menor o igual que un valor.

    AttributeValueList puede contener un solo valor de tipo String (cadena), Number (número) o Binary (binario) (no un conjunto). Si un elemento contiene un AttributeValue de un tipo distinto del especificado en la solicitud, el valor no coincide.

  • LT: es true si un atributo es menor que un valor.

    AttributeValueList puede contener un solo valor de tipo String (cadena), Number (número) o Binary (binario) (no un conjunto). Si un elemento contiene un valor de un tipo distinto del especificado en la solicitud, el valor no coincide.

  • GE: es true si un atributo es mayor o igual que un valor.

    AttributeValueList puede contener un solo valor de tipo String (cadena), Number (número) o Binary (binario) (no un conjunto). Si un elemento contiene un valor de un tipo distinto del especificado en la solicitud, el valor no coincide.

  • GT: es true si un atributo es mayor que un valor.

    AttributeValueList puede contener un solo valor de tipo String (cadena), Number (número) o Binary (binario) (no un conjunto). Si un elemento contiene un valor de un tipo distinto del especificado en la solicitud, el valor no coincide.

  • CONTAINS: es true si un valor está presente en un conjunto o si un valor contiene otro valor.

    AttributeValueList puede contener un solo valor de tipo String (cadena), Number (número) o Binary (binario) (no un 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, entonces el operador se evalúa en true si encuentra una coincidencia exacta con cualquier miembro del conjunto.

  • NOT_CONTAINS: es true si un valor no está presente en un conjunto o si un valor no contiene otro valor.

    AttributeValueList puede contener un solo valor de tipo String (cadena), Number (número) o Binary (binario) (no un 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, entonces el operador se evalúa en true si no encuentra una coincidencia exacta con cualquier miembro del conjunto.

  • BEGINS_WITH: es true (verdadero) si los primeros caracteres de un atributo coinciden con el valor proporcionado. No use este operador para comparar números.

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

Use estos operadores para comparar un atributo con un valor. Debe especificar una lista AttributeValueList compuesta por un solo valor. Para la mayoría de los operadores, este debe ser un valor escalar; sin embargo, los operadores EQ y NE también admiten conjuntos.

Ejemplos

Las siguientes expresiones se evalúan en true si:

  • El precio de un producto es mayor que 100.

    ... "Price": { ComparisonOperator: "GT", AttributeValueList: [ {"N":"100"} ] } ...
  • La categoría de un producto comienza con "Bo".

    ... "ProductCategory": { ComparisonOperator: "BEGINS_WITH", AttributeValueList: [ {"S":"Bo"} ] } ...
  • Un producto está disponible en rojo, verde o negro:

    ... "Color": { ComparisonOperator: "EQ", AttributeValueList: [ [ {"S":"Black"}, {"S":"Red"}, {"S":"Green"} ] ] } ...
    nota

    Al comparar datos de tipo Set (conjunto), el orden de las entradas carece de relevancia. DynamoDB devolverá solo los elementos con el mismo conjunto de valores, independientemente del orden en que los especifique en la solicitud.

Operadores de comparación con dos valores de atributos

  • BETWEEN: es true si un valor está comprendido entre un límite inferior y un límite superior, ambos incluidos.

    AttributeValueList debe contener dos entradas del mismo tipo, que puede ser String (cadena), Number (número) o Binary (binario) (pero no un 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 un valor de un tipo distinto del especificado en la solicitud, el valor no coincide.

Use este operador para determinar si un valor de atributo está dentro de un intervalo. AttributeValueList debe contener dos entradas escalares del mismo tipo: String, Number o Binary.

Ejemplo

La siguiente expresión se evalúa en true si el precio de un producto está comprendido entre 100 y 200.

... "Price": { ComparisonOperator: "BETWEEN", AttributeValueList: [ {"N":"100"}, {"N":"200"} ] } ...

Operadores de comparación con n valores de atributos

  • IN: es true (verdadero) si un valor es igual que cualquiera de los valores de una lista. Solo se admiten valores escalares en la lista, no conjuntos. El atributo de destino debe ser del mismo tipo y valor exactos para que se produzca la coincidencia.

    AttributeValueList puede contener una o varias entradas de tipo String (cadena), Number (número) o Binary (binario) (no un conjunto). Estos atributos se comparan con un atributo existente que no sea 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.

    AttributeValueList puede contener uno o varios valores de tipo String (cadena), Number (número) o Binary (binario) (no un conjunto). El atributo de destino de la comparación debe ser del mismo tipo y valor exacto para que se produzca la coincidencia. Un valor de tipo String nunca coincide con un valor de tipo String Set.

Use este operador para determinar si el valor suministrado está contenido en una lista. Puede especificar cualquier número de valores escalares en AttributeValueList, pero todos ellos deben ser del mismo tipo de datos.

Ejemplo

La siguiente expresión se evalúa en true si el valor de Id es 201, 203 o 205.

... "Id": { ComparisonOperator: "IN", AttributeValueList: [ {"N":"201"}, {"N":"203"}, {"N":"205"} ] } ...

Uso de varias condiciones

DynamoDB permite combinar varias condiciones para crear expresiones complejas. Para ello, hay que proporcionar al menos dos expresiones, con un ConditionalOperator (heredado) opcional.

De forma predeterminada, cuando se especifica más de una condición, todas ellas deben evaluarse en true (verdadero) para que la expresión completa se evalúe en true (verdadero). Es decir, se lleva a cabo una operación AND implícita.

Ejemplo

La siguiente expresión se evalúa en true si un producto es un libro que tiene al menos 600 páginas. Deben evaluarse en true las dos condiciones, puesto que implícitamente se les aplica el operador AND.

... "ProductCategory": { ComparisonOperator: "EQ", AttributeValueList: [ {"S":"Book"} ] }, "PageCount": { ComparisonOperator: "GE", AttributeValueList: [ {"N":600"} ] } ...

Puede utilizar ConditionalOperator (heredado) para aclarar que se llevará a cabo una operación AND. En el siguiente ejemplo, el comportamiento es el mismo que en el caso anterior.

... "ConditionalOperator" : "AND", "ProductCategory": { "ComparisonOperator": "EQ", "AttributeValueList": [ {"N":"Book"} ] }, "PageCount": { "ComparisonOperator": "GE", "AttributeValueList": [ {"N":600"} ] } ...

También puede establecer ConditionalOperator en OR, en cuyo caso al menos una de las condiciones deberá evaluarse en true.

Ejemplo

La siguiente expresión se evalúa en true si un producto es una bicicleta de montaña, es de una marca concreta o su precio es mayor que 100.

... ConditionalOperator : "OR", "BicycleType": { "ComparisonOperator": "EQ", "AttributeValueList": [ {"S":"Mountain" ] }, "Brand": { "ComparisonOperator": "EQ", "AttributeValueList": [ {"S":"Brand-Company A" ] }, "Price": { "ComparisonOperator": "GT", "AttributeValueList": [ {"N":"100"} ] } ...
nota

En una expresión compleja, las condiciones se procesan por orden, desde la primera hasta la última.

No se puede utilizar AND y OR en la misma expresión.

Otros operadores condicionales

En versiones anteriores de DynamoDB, el parámetro Expected se comportaba de forma distinta para las escrituras condicionales. Cada elemento del mapa Expected representaba un nombre de atributo que DynamoDB debía verificar, además de lo siguiente:

  • Value: valor que se va a comparar con el atributo.

  • Exists: determina si el valor existe antes de intentar la operación.

DynamoDB continúa admitiendo las opciones Value y Exists. Sin embargo, solo permiten comprobar una condición de desigualdad o si un atributo existe. Recomendamos usar ComparisonOperator y AttributeValueList en su lugar, porque estas opciones permiten construir un abanico de condiciones mucho más amplio.

ejemplo

DeleteItem permite verificar si un libro está descatalogado y eliminarlo únicamente si se cumple esta condición. A continuación se muestra un ejemplo de la AWS CLI en el que se usa una condición heredada:

aws dynamodb delete-item \ --table-name ProductCatalog \ --key '{ "Id": {"N":"600"} }' \ --expected '{ "InPublication": { "Exists": true, "Value": {"BOOL":false} } }'

En el siguiente ejemplo se realiza la misma operación, pero sin la condición heredada:

aws dynamodb delete-item \ --table-name ProductCatalog \ --key '{ "Id": {"N":"600"} }' \ --expected '{ "InPublication": { "ComparisonOperator": "EQ", "AttributeValueList": [ {"BOOL":false} ] } }'
ejemplo

Una operación PutItem permite proteger los datos para evitar que se sobrescriba un elemento existente que tenga los mismos atributos de clave principal. A continuación se muestra un ejemplo de la en el que se usa una condición heredada:

aws dynamodb put-item \ --table-name ProductCatalog \ --item '{ "Id": {"N":"500"}, "Title": {"S":"Book 500 Title"} }' \ --expected '{ "Id": { "Exists": false } }'

En el siguiente ejemplo se realiza la misma operación, pero sin la condición heredada:

aws dynamodb put-item \ --table-name ProductCatalog \ --item '{ "Id": {"N":"500"}, "Title": {"S":"Book 500 Title"} }' \ --expected '{ "Id": { "ComparisonOperator": "NULL" } }'
nota

Para las condiciones del mapa Expected, no use las opciones Value y Exists heredadas con ComparisonOperator y AttributeValueList. Si lo hace, se producirá un error en la escritura condicional.