Saltar al contenido

AWS DynamoDB Scan y FilterExpression usando array de valores hash

Indagamos en diferentes foros y de este modo regalarte la respuesta a tu duda, si tienes alguna difcultad deja la pregunta y te respondemos con mucho gusto.

Solución:

Debes hacer uso de la IN operador. También es más fácil usar marcadores de posición para attribute nombres y attribute valores. Sin embargo, desaconsejaría el uso de un Scan en este caso. Parece que ya tienes el hash key attribute valores que desea encontrar, por lo que tendría más sentido utilizar BatchGetItem.

De todos modos, así es como lo harías en Java:

ScanSpec scanSpec = new ScanSpec()
    .withFilterExpression("#idname in (:val1, :val2, :val3)")
    .withNameMap(ImmutableMap.of("#idname", "ID"))
    .withValueMap(ImmutableMap.of(":val1", "123", ":val2", "456", ":val23", "789"));
ItemCollection = table.scan(scanSpec);

Me imagino que usando el SDK de Javascript sería algo como esto:

var scanParams = 
  "TableName":"myAwsTable",
  "AttributesToGet": ['ID','COMMENTS','DATE'],
  "FilterExpression": '#idname in (:val1, :val2, :val3)',
  "ExpressionAttributeNames": 
    '#idname': 'ID'
  ,
  "ExpressionAttributeValues": 
    ':val1': '123',
    ':val2': '456',
    ':val3': '789'
  

Tuve este problema y lo descubrí usando el parámetro contiene

// Object stored in the DB looks like this: 
// [
//     'name' => 'myName',
//     'age' => '24',
//     'gender' => 'Male',
//     'visited' => [
//          'countries': ['Canada', 'USA', 'Japan', 'Australia'],
//          'last_trip': '2015/12/13',
//          'reviews_written': 20
//     ]
// 
// ];

$countries = ['Canada', 'USA', 'Japan', 'Australia'];

$paramToMatch = '24';

$client->query([
        'TableName'     => 'MyDyanmoDB',
        'KeyConditions' => [
            'age' => [
                'AttributeValueList' => [
                    $marshaler->marshalValue($paramToMatch)
                ],
                'ComparisonOperator' => 'EQ'
            ]
        ],
        'ExpressionAttributeNames' => [
            '#visited'   => 'visited',
            '#countries' => 'countries'
        ],
        'ExpressionAttributeValues' => [
            ':countries' => $marshaler->marshalValue($countries)
        ],
        'FilterExpression' => 'contains(:countries, #visited.#countries)',
]);

Así es como pude usar “escanear” para obtener los elementos con una identificación particular (“ContentID”) en el siguiente ejemplo:

var params = 
    TableName: environment.ddbContentTableName,
    ProjectionExpression: "Title, ContentId, Link",
    FilterExpression: "ContentId in (:contentId1, :contentId2, :contentId3, :contentId4)",
    ExpressionAttributeValues: ":contentId1":102,":contentId2":104,":contentId3":103,":contentId4":101
;

var docClient = new AWS.DynamoDB.DocumentClient();
docClient.scan(params, onQuery); 

Luego puedo construir programáticamente FilterExpression y ExpressionAttributeValues ​​en función de valores conocidos, por ejemplo

    // Create the FilterExpression and ExpressionAttributeValues
    var filterExpression =  "ContentId in ("; 

    var expressionAttributeValues = ;

    for (var i = 0; i < currentFavorites.length; i++)  
        var contentIdName = ":contentId"+(i+1);
        
        if (i==0) 
            filterExpression = filterExpression + contentIdName;
         else 
            filterExpression = filterExpression + ", " + contentIdName;
        

        expressionAttributeValues[contentIdName] = currentFavorites[i];
    

    filterExpression = filterExpression + ")";

    var params = 
        TableName: environment.ddbContentTableName,
        ProjectionExpression: "Title, ContentId, Link",
        FilterExpression: filterExpression,
        ExpressionAttributeValues: expressionAttributeValues
    ;

    var docClient = new AWS.DynamoDB.DocumentClient();
    docClient.scan(params, onQuery); 

Calificaciones y comentarios

Si estás de acuerdo, eres capaz de dejar una sección acerca de qué te ha parecido este post.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *