3

Je suis le didacticiel DynamoDB python. Cette étape montre comment interroger la table en fonction d'une clé spécifique: http://docs.aws.amazon.com/amazondynamodb/latest/gettingstartedguide/GettingStarted.Python.04.html.DynamoDB - Comment interroger un attribut imbriqué boto3

Voici le code pour cette requête:

from __future__ import print_function # Python 2/3 compatibility 
import boto3 
import json 
import decimal 
from boto3.dynamodb.conditions import Key, Attr 

# Helper class to convert a DynamoDB item to JSON. 
class DecimalEncoder(json.JSONEncoder): 
    def default(self, o): 
     if isinstance(o, decimal.Decimal): 
      return str(o) 
     return super(DecimalEncoder, self).default(o) 

dynamodb = boto3.resource('dynamodb', region_name='us-west-2', endpoint_url="http://localhost:8000") 

table = dynamodb.Table('Movies') 

print("Movies from 1992 - titles A-L, with genres and lead actor") 

response = table.query(
    ProjectionExpression="#yr, title, info.genres, info.actors[0]", 
    ExpressionAttributeNames={ "#yr": "year" }, # Expression Attribute Names for Projection Expression only. 
    KeyConditionExpression=Key('year').eq(1992) & Key('title').between('A', 'L') 
) 

for i in response[u'Items']: 
    print(json.dumps(i, cls=DecimalEncoder)) 

Un élément de réponse exemple est

{ 
    "title": "Juice", 
    "year": "1992", 
    "info": { 
     "actors": [ 
      "Omar Epps" 
     ], 
     "genres": [ 
      "Crime", 
      "Drama", 
      "Thriller" 
     ] 
    } 
} 

La table a deux de titre «attributs clés et « année », ainsi que le imbriquée attribut 'info'. Ce que j'essaye de faire est d'interroger la base de données et de filtrer les films par genre, par exemple obtenir tous les films dramatiques. Je ne suis pas sûr comment faire cela puisque la clé de genre est imbriquée dans l'info.

J'ai essayé d'obtenir tous les films dramatiques de 1992 comme celui-ci mais il est venu vide.

response = table.query(
    KeyConditionExpression=Key('year').eq(1992), 
    FilterExpression=Attr('info.genres').eq('Drama') 
) 

Comment filtrer correctement cette requête avec l'attribut info imbriqué?

+0

DynamoDB est conçu pour être interrogé par les clés, afin d'accomplir ce que vous voulez, vous devrez interroger l'ensemble tableau et regardez les entrées une par une après les avoir obtenues. Si vous savez que vous allez faire beaucoup de requêtes comme ça encore et encore, je vous suggère de repenser votre utilisation de DynamoDB ou les clés que vous voulez utiliser. – mprat

+0

ok merci pour l'astuce –

+0

Puisque DynamoDb est mal adapté pour cela, avez-vous une suggestion pour un type différent de base de données à utiliser? Je suis nouveau aux bases de données –

Répondre

3

Vous pouvez utiliser contains pour filtrer les données de Liste type de données.

genres -attribut stockés sous forme de liste à l'intérieur info attribut qui est un type de données cartographiques

FilterExpression=Attr('info.genres').contains('Drama') 
+0

hey, comment comparer si mon 'geners' est un tableau d'objets et je veux comparer un attribut de l'objet tableau. par exemple. "genres": [ {"name": "Crime", description: ""}, {"name": "Drame", description: ""}, {"nom": "Thriller," description: " "}, ] Je veux comparer le nom dans cet exemple .. –