2015-12-10 1 views
1

Je suis nouveau à DynamoDb et j'ai du mal à trouver comment faire cela (en utilisant le java sdk).trouver tous les éléments où un champ de liste contient une valeur dans dynamodb

J'ai actuellement une table (en mongo) pour les notifications. Le schéma est essentiellement comme suit (je l'ai simplifié il)

id: string 
notifiedUsers: [123, 345, 456, 567] 
message: "this is a message" 
created: 12345678000 (epoch millis) 

Je voulais migrer vers DynamoDB, mais je ne peux pas trouver la meilleure façon de sélectionner toutes les notifications qui sont allés à un utilisateur particulier après un certain rendez-vous amoureux?

Je comprends que je ne peux pas avoir un index sur une liste comme notifyUsers, donc je ne peux pas utiliser une requête dans ce cas - est-ce correct?

Je préférerais ne pas scanner et filtrer, il pourrait y avoir beaucoup d'enregistrements.

Y at-il un moyen de le faire en utilisant une requête ou une autre approche?

EDIT C'est ce que j'essaie maintenant, ça ne marche pas et je ne sais pas où le prendre (si n'importe où).

Condition rangeKeyCondition = new Condition() 
    .withComparisonOperator(ComparisonOperator.CONTAINS.toString()) 
    .withAttributeValueList(new AttributeValue().withS(userId)); 

if(startTimestamp != null) { 
    rangeKeyCondition = rangeKeyCondition.withComparisonOperator(ComparisonOperator.GT.toString()) 
     .withAttributeValueList(new AttributeValue().withS(startTimestamp)); 
} 

NotificationFeedDynamoRecord replyKey = new NotificationFeedDynamoRecord(); 
replyKey.setId(partitionKey); 

DynamoDBQueryExpression<NotificationFeedDynamoRecord> queryExpression = new DynamoDBQueryExpression<NotificationFeedDynamoRecord>() 
    .withHashKeyValues(replyKey) 
    .withRangeKeyCondition(NOTIFICATIONS, rangeKeyCondition); 
+0

Avez-vous envisagé de modifier le schéma ou n'est-ce pas autorisé? – hofan41

+0

c'est permis mais je n'ai pas trouvé une bonne alternative. J'ai simplifié le schéma pour la question, cependant la table réelle a une liste cachée, une carte de readTimestamp et d'autres choses. Si je peux le faire fonctionner, ce sera plus facile, mais je comprends votre point de vue. – mark

+0

DynamoDB encourage l'utilisation de «Une clé composite de hash est indexée en tant qu'élément de clé de hachage et élément de clé de gamme.Cette clé en plusieurs parties maintient une hiérarchie entre les valeurs du premier et du second élément.Par exemple, une plage de hachage composite key peut être une combinaison de "UserID" (hash) et "Timestamp" (range) .En maintenant la constante de l'élément de clé de hachage, vous pouvez rechercher dans l'élément clé range pour récupérer les éléments. par exemple, récupérer tous les éléments pour un seul UserID sur une plage d'horodatages. " – hofan41

Répondre

0

Au cas où quelqu'un d'autre vient à travers cette question, à la fin nous avons aplani le schéma, de sorte qu'il ya maintenant un enregistrement par userId. Cela a provoqué des problèmes car il n'est pas possible avec dynamoDb d'écrire par lots de façon atomique. Avec le schéma d'origine, nous avions un enregistrement, et nous pouvions l'écrire de façon atomique en nous assurant que tous les utilisateurs recevaient cette notification. Maintenant, nous ne pouvons pas être certains, et cela cause de la douleur.