2017-10-09 3 views
-1

Avec le json ci-dessous dans dynamodb comment puis-je rechercher un élément où session.id == "12ghbcyg" en utilisant boto3 en python?Comment rechercher une liste de cartes dans dynamodb en utilisant boto3

{ 
    "name": "John", 
    "sessions": [ 
     { 
      "id": "12ghbcyg", 
      "foo": "bar" 
     } 
    ] 
} 
+0

Simplement il est impossible d'interroger ou analyser les données par identifiant de session seule. DynamoDB n'a pas cette fonctionnalité. Vous avez besoin à la fois de l'identifiant et de la foo pour trouver la valeur. – notionquest

+0

@notionquest Pourriez-vous montrer cela? Ce serait également acceptable. – Aaronepower

Répondre

1

Voici l'exemple de scan utilisant contains. Veuillez noter que l'analyse est une opération coûteuse si la table contient des millions d'éléments. Normalement, l'analyse est utilisée si vous ne connaissez pas la valeur de la clé de partition. Même si vous ne connaissez pas la valeur de la clé de partition, la solution la plus recommandée consiste à utiliser l'index secondaire global (GSI) et à interroger directement l'index plutôt que la table.

Vous devrez peut-être explorer les options ci-dessus et décider de l'approche adaptée à votre cas d'utilisation.

Le code ci-dessous est pour donner une idée de l'utilisation API SCAN utilisant contient. Vous pouvez également utiliser CONTAINS sur l'API QUERY si vous connaissez la valeur de la clé de partition.

balayage à l'aide contient: -

from __future__ import print_function # Python 2/3 compatibility 
import boto3 
from botocore.exceptions import ClientError 
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): 
      if o % 1 > 0: 
       return float(o) 
      else: 
       return int(o) 
     return super(DecimalEncoder, self).default(o) 

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

table = dynamodb.Table('usertable') 

print("Scanning...") 

sessionData = { 
     "id": "12ghbcyg", 
     "foo": "bar" 
     } 

fe = Attr('sessions').contains(sessionData) 

response = table.scan(
     FilterExpression=fe   
    ) 

for i in response['Items']: 

    print(json.dumps(i, cls=DecimalEncoder)) 

while 'LastEvaluatedKey' in response: 
    response = table.scan(  
     FilterExpression=fe,   
     ExclusiveStartKey=response['LastEvaluatedKey'] 
     ) 

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