web-dev-qa-db-fra.com

Comment puis-je récupérer tous les éléments d'une table DynamoDB sans spécifier la clé primaire?

J'ai une table appelée produits avec clé primaire Id. Je veux sélectionner tous les éléments du tableau. C'est le code que j'utilise:

$batch_get_response = $dynamodb->batch_get_item(array(
    'RequestItems' => array(

        'products' => array(
            'Keys' => array(
                array( // Key #1
                    'HashKeyElement'  => array( AmazonDynamoDB::TYPE_NUMBER => '1'),
                    'RangeKeyElement' => array( AmazonDynamoDB::TYPE_NUMBER => $current_time),
                ),
                array( // Key #2
                    'HashKeyElement'  => array( AmazonDynamoDB::TYPE_NUMBER => '2'),
                    'RangeKeyElement' => array( AmazonDynamoDB::TYPE_NUMBER => $current_time),
                ),
            )
        )
    )   
));

Est-il possible de sélectionner tous les éléments sans spécifier la clé primaire? J'utilise le kit AWS SDK pour PHP.

20
Warrior

Amazon DynamoDB fournit l'opération Scan à cette fin, qui retourne un ou plusieurs éléments et ses attributs en effectuant une analyse complète d'une table. Veuillez prendre en compte les deux contraintes suivantes:

  • En fonction de la taille de votre table, vous devrez peut-être utiliser la pagination pour récupérer l'ensemble des résultats: 

    Remarque
    Si le nombre total d'éléments numérisés dépasse la limite de 1 Mo, le fichier l'analyse s'arrête et les résultats sont renvoyés à l'utilisateur avec un LastEvaluatedKey pour continuer l'analyse lors d'une opération ultérieure. Le les résultats incluent également le nombre d'éléments dépassant la limite. Un scanner peut aboutir à ce qu'aucune donnée de table ne réponde aux critères de filtrage.

    L'ensemble de résultats est finalement cohérent.

  • L’opération d’analyse est potentiellement coûteuse en termes de performances et de capacité consommée (c’est-à-dire, prix), voir la section Performances d'analyse et d'interrogation dans Interrogation et analyse dans Amazon DynamoDB :

    [...] De plus, à mesure que la table grandit, l'opération de numérisation ralentit. Le scan operation examine chaque élément pour les valeurs demandées, et peut utiliser jusqu'à le débit alloué pour une grande table en une seule opération . Pour des temps de réponse plus rapides, concevez vos tables de manière à pouvoir utiliser les API Query, Get ou BatchGetItem, à la place. Ou, concevez votre application à utiliser les opérations d’analyse de manière à minimiser l’impact sur le taux de demande de votre table. Pour plus d'informations, voir Provisioned Consignes de débit dans Amazon DynamoDB . _ {[souligne moi]} _

Vous pouvez trouver plus de détails sur cette opération et des exemples de fragments dans Numérisation de tables Utilisation du kit AWS SDK pour PHP API de bas niveau pour Amazon DynamoDB , l'exemple le plus simple illustrant l'opération étant:

$dynamodb = new AmazonDynamoDB();

$scan_response = $dynamodb->scan(array(
    'TableName' => 'ProductCatalog' 
));

foreach ($scan_response->body->Items as $item)
{
    echo "<p><strong>Item Number:</strong>"
         . (string) $item->Id->{AmazonDynamoDB::TYPE_NUMBER};
    echo "<br><strong>Item Name: </strong>"
         . (string) $item->Title->{AmazonDynamoDB::TYPE_STRING} ."</p>";
}
35
Steffen Opel

Je récupère tous les éléments de dynamodb avec la requête suivante. Ça fonctionne bien. Je crée ces fonctions génériques dans Zend Framework et j'accède à ces fonctions via le projet.

        public function getQuerydata($tablename, $filterKey, $filterValue){
            return $this->getQuerydataWithOp($tablename, $filterKey, $filterValue, 'EQ');
        }

        public function getQuerydataWithOp($tablename, $filterKey, $filterValue, $compOperator){
        $result = $this->getClientdb()->query(array(
                'TableName'     => $tablename,
                'IndexName'     => $filterKey,
                'Select'        => 'ALL_ATTRIBUTES',
                'KeyConditions' => array(
                    $filterKey => array(
                        'AttributeValueList' => array(
                            array('S' => $filterValue)
                        ),
                'ComparisonOperator' => $compOperator
            )
            )
        ));
            return $result['Items'];
        }

       //Below i Access these functions and get data.
       $accountsimg = $this->getQuerydataWithPrimary('accounts', 'accountID',$msgdata[0]['accountID']['S']);
0
Hassan Raza