web-dev-qa-db-fra.com

Utilisation du filtre contient dans l'analyse DynamoDB avec Java

Supposons que j'ai une requête de travail telle que:

ScanRequest scanRequest = new ScanRequest()
            .withTableName("myTable")
            .withFilterExpression("attr1 = :val1 and attr2 = :val2")
            .withExpressionAttributeValues(vm)  //contains values for :val1 and :val2
            .withLimit(PAGE_SIZE)
            .withConsistentRead(READ_TYPE);

Maintenant, je voudrais étendre cette analyse. Supposons que ma table ait également un attribut attr3 qui a la forme:

"attr3": {
    "S": "AAA BBB CCC DDD"
}

Comment puis-je filtrer les éléments dont attr3 contient AAA? Ou AAA et BBB?

12
user3146897

Le DynamoDB documentation de référence des expressions de condition est votre ami!

Dans votre cas spécifique, vous pouvez utiliser la fonction contient pour rechercher une sous-chaîne. Votre expression de filtre pourrait ressembler à ceci:

"attr1 = :val1 and attr2 = :val2 and (contains(attr3, :val3a) or contains(attr3, :val3b))"             
// where :val3a and :val3b are value placeholders for say AAA and BBB

Mais je soupçonne que ce que vous voulez réaliser est un peu plus sophistiqué que ce qui peut être géré côté serveur par les filtres DynamoDB, vous avez donc deux options:

  1. faire le filtrage dans la logique d'application (c.-à-d. apporter vos résultats au client et y filtrer), ou;
  2. changer votre attribut d'une chaîne en une liste ou un ensemble de chaînes (si les doublons ne sont pas autorisés)

Dans les deux cas, vous devez savoir qu'une analyse avec des filtres n'est que plus efficace qu'une analyse régulière en termes de bande réseau (dans le cas où la plupart des résultats sont exclus par le filtre). Mais en termes de capacité consommée, un Scan est tout aussi cher avec ou sans filtres. Donc, si vous pouvez l'éviter, ne comptez pas trop sur votre table!

25
Mike Dinescu