2012-02-22 4 views
4

Est-il possible de travailler avec "OU", "et" Interrogez les opérations dans DynamoDB?Opérations de requête Dynamodb

Je dois savoir si DynamoDB a quelque chose comme "where fname = xxxx OR lname = xxxx "de requêtes SQL? Rails

Merci.

+0

RTFM? Les docs sont un bon endroit pour trouver de telles réponses. –

+0

http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/queryingdynamodb.html – Hal

Répondre

6

En général, non.

DynamoDB permet uniquement recherche efficace en primaire (hachage) key, plus éventuellement une requête de plage sur la "clé de plage" Les autres attributs ne sont pas indexés

Vous pouvez utiliser une requête Scan pour lire un filtre de table entier en fonction d'un ensemble d'attributs , mais c'est une option relativement chère et lente pour les grandes tables.

Vous pouvez simuler et en créant une clé primaire qui comprend les deux valeurs à interroger, et ou en créant des tables en double qui utilisent chacun un attribut comme clé primaire, et interroger les deux tables en parallèle avec BatchGetItem

1

Comme BCoates a mentionné que la réponse est NON.

Si vous souhaitez une lecture cohérente, vous ne pouvez pas utiliser BatchGetItem.

0

Non, il ne peut utiliser ou d'opérateur, Par exemple, dans KeyConditionExpression: '#hashkey =: hk_val ET #rangekey>: rk_val',

il utilise Et opérateur pour faire correspondre le bot pour HASH et RANGE Key.

Par conséquent, nous ne pouvons pas utiliser ou dans Dynamo Db.

0

Bien qu'il n'y ait pas une telle chose comme "OU", "ET", mais vous pouvez toujours simuler des requêtes SQL en utilisant scan et FilterExpression. Mais rappelez-vous que si vous utilisez scan, cela signifie que toute la table sera récupérée puis traitée, et que scan ne scanne pas toujours toute la table en une seule itération. donc vous risquez de manquer certains articles. cette méthode est généralement évitée car elle est très coûteuse. mais voici morceau de code python3 en utilisant api boto3 qui peut simuler la requête SQL que vous voulez

response = table.scan(
FilterExpression=Attr('fname').eq('xxxxx') | Attr('lname').eq('xxxxx')) 

FilterExpression aussi différents operatiors comme &, ~