

# Escritura de condiciones con parámetros heredados
<a name="LegacyConditionalParameters.Conditions"></a>

**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](Expressions.md).

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](Expressions.md).

## Condiciones simples
<a name="LegacyConditionalParameters.Simple"></a>

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
<a name="LegacyConditionalParameters.Conditions.Simple.NoAttributeValues"></a>
+ `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
<a name="LegacyConditionalParameters.Conditions.Simple.OneAttributeValue"></a>
+ `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
<a name="LegacyConditionalParameters.Conditions.Simple.TwoAttributeValues"></a>
+ `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
<a name="LegacyConditionalParameters.Conditions.Simple.NAttributeValues"></a>
+ `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
<a name="LegacyConditionalParameters.Conditions.Multiple"></a>

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

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)](LegacyConditionalParameters.ConditionalOperator.md) 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
<a name="LegacyConditionalParameters.Conditions.Other"></a>

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.

**Example**  
`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} ]
        } 
    }'
```

**Example**  
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 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.