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
?
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:
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 ).
Oui, vous pouvez passer liste ou valeur.
data = table.scan(FilterExpression=Attr('RelatedItems').contains([1, 2, 3]) & Attr('Pictures.RearView').eq('1'))
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'))