web-dev-qa-db-fra.com

Prise en charge des requêtes imbriquées DynamoDB

L'opération d'analyse Amazon DynamoDB vous permet-elle d'interroger des attributs imbriqués de type Array ou Object? Par exemple,

{
    Id: 206,
    Title: "20-Bicycle 206",
    Description: "206 description",
    RelatedItems: [
        341, 
        472, 
        649
    ],
    Pictures: {
        FrontView: "123", 
        RearView: "456",
        SideView: "789"
    }
}

Puis-je interroger sur les attributs RelatedItems[2] ou Pictures.RearView?

14
Hiren

Oui, vous pouvez utiliser une expression de filtre Filter , qui ressemble à une expression de condition. La section qui parle de les fonctions que vous pouvez utiliser dans ces types d’expression mentionne ce qui suit:

"Pour un attribut imbriqué, vous devez fournir son chemin complet. Pour plus d'informations, voir Chemins de document ."

La référence Document Paths contient des exemples sur la manière de référencer des attributs imbriqués dans les types de données DynamoDB tels que List (ce que vous appelez un tableau) et Map (ce que vous appelez un objet). Consultez cette référence pour des exemples sur la façon de le faire:

  • Ma liste [0]
  • Une autre liste [12]
  • ThisList [5] [11]
  • MyMap.nestedField
  • MyMap.nestedField.deeplyNestedField
21
readyornot

Veuillez noter que dans DyanomoDB query et scan sont très différents (scan est une opération beaucoup plus coûteuse). Ainsi, alors que vous pouvez filtrer sur les deux comme le souligne @coffeeplease; vous ne pouvez interroger/indexer que sur:

Le schéma de clé pour l'index. Chaque attribut du schéma de clé d'index doit être un attribut de niveau supérieur du type String, Number ou Binary. Les autres types de données, y compris les documents et les ensembles, ne sont pas autorisés ( ref ).

5
Neil

Oui, vous pouvez passer liste ou valeur.

data = table.scan(FilterExpression=Attr('RelatedItems').contains([1, 2, 3]) & Attr('Pictures.RearView').eq('1'))
1
abhimanyu

Oui, vous pouvez interroger des attributs imbriqués de type tableau ou objet à l'aide de l'analyse ou de la requête.

Référence pour Python boto3: https://boto3.amazonaws.com/v1/documentation/api/latest/guide/dynamodb.html#querying-and-scanning

Exemple: supposons que vous souhaitiez rechercher des enregistrements pour lesquels le RearView" > 500 et le second élément de RelatedItems" > 200, vous pouvez effectuer les opérations suivantes:

data = table.scan(
    FilterExpression=Attr('RelatedItems[1]').gt('200') & Attr('Pictures.RearView').gt('500'))
1
Sujata