2015-04-23 1 views
1

J'utilise DynamoDB et stocke également des documents en lui passant JSON, tous en utilisant la classe DynamoDBMapper, en Java.Analyse du document DynamoDB JSON à l'aide de Java et de DynamoDBMapper

Il est assez simple de mettre des données dans la table. Et aussi pour interroger la table si vous avez les valeurs Hash ou Range disponibles.

Mais je veux effectuer une analyse (je présume) pour une valeur avec le document JSON. J'ai cherché des exemples mais je ne peux pas en trouver, ou du moins pas en utilisant la méthode DynamoDBMapper.

Alors, aurais-je raison de penser que cela peut être fait? Si oui, quelqu'un a-t-il un exemple de faire cela? Plus précisément, comment spécifiez-vous l'attribut dans le document/JSON sur lequel vous souhaitez interroger?

Ma table est configurée avec un Hash, un Range et un attribut "document" contenant le JSON qui lui a été transmis. Donc, si je voulais vérifier une valeur "name" dans ce "document", comment puis-je le spécifier dans une Condition?

Voici un exemple d'un extrait de code que j'ai essayé:

DynamoDBScanExpression scanExpression = new DynamoDBScanExpression(); 
    scanExpression 
      .addFilterCondition(
        "document.name", 
        new Condition().withComparisonOperator(
          ComparisonOperator.EQ) 
          .withAttributeValueList(
            new AttributeValue() 
              .withS(existingWebsiteName))); 
    List<PublisherSite> scanResult = getMapper().scan(PublisherSite.class, scanExpression); 

J'ai aussi essayé specifiying le nomAttribut comme un simple « nom » aussi, mais cela ne fonctionne pas non plus. Je n'obtiens aucun résultat.

+0

Pouvez-vous ajouter votre code 'PublisherSite' et un' mapper.save() 'appeler pour faire un [MCVE] (http://stackoverflow.com/help/mcve)? – mkobit

+0

Essayez d'abord la requête avec une valeur scalaire plus simple (au lieu de la carte ou du type de document) ... voyez si cela fonctionne, et s'il vous plaît mettez un exemple du JSON que vous stockez dans la base de données. thxs – bsd

Répondre

1

Les conditions de filtre ne fonctionnent que pour les attributs de niveau supérieur. Votre extrait tente de placer un FilterCondition sur un attribut de niveau supérieur nommé "document.name". Au lieu de cela, vous pouvez utiliser un FilterExpression pour conditionner la récupération d'éléments sur des attributs imbriqués, et vous pouvez utiliser un ProjectionExpression pour sélectionner les attributs de niveau supérieur et imbriqués que vous désirez.

final String filterExpression = "document.name = :existingWebsiteName"; 
final Map<String, AttributeValue> expressionAttributeValues = Collections.singletonMap(":existingWebsiteName", existingWebsiteName); 

DynamoDBScanExpression scanExpression = new DynamoDBScanExpression() 
    .withFilterExpression("document.name = :existingWebsiteName") 
    .withExpressionAttributeValues(expressionAttributeValues); 
List<PublisherSite> scanResult = getMapper().scan(PublisherSite.class, scanExpression);