【AWS DynamoDB】如果子键存在则查询嵌套项目

问题描述 投票:0回答:1

这是 dynamodb 表上的项目格式

{
 "id":"partition_key_id",
 "Products": {
    "ProductGroupA": [
      {
       "Description": "2",
      }
  ],
    "ProductGroupC": [
      {
       "Description": "3",
      }
  ]
 }
}

仅当嵌套键“Products.ProductGroupA”存在时,我才尝试查询该项目:


import boto3

dynamodb = boto3.client('dynamodb')

index_name = 'Products-index'

response = dynamodb.query(
    TableName='my_table',
    IndexName=index_name,
    FilterExpression='attribute_exists(#Products.#a)',
    ExpressionAttributeNames={
        '#Products': 'Products',
        '#a': 'ProductGroupA'
    },
)


但是,我总是收到错误。使用boto3的“查询”方法可以实现这个目标吗?我想避免使用“扫描”方法,因为会消耗 RCU

如果无法查询,有什么建议吗?或者我应该调整dynamodb表的结构格式。我尝试嵌套格式的原因是易于管理,但读取效率使得实现起来非常困难。

非常感谢。 祝你有美好的一天!

python amazon-web-services amazon-dynamodb aws-sdk dynamodb-queries
1个回答
0
投票

创建此索引时,您将指定分区键或/和排序键。这些是您的索引搜索所必需的字段。然后,您需要在查询中添加

KeyConditionExpression
,然后才能给它
FilterExpression

response = dynamodb.query(
  IndexName='Products-Index',
  KeyConditionExpression='id = :id',
  FilterExpression='attribute_exists(Products.ProductGroupA)',
  ExpressionAttributeValues={
    ':id': 'partition_key_id',
  }
)

此方法将使用您的索引来检索具有

partition_key_id
的对象,然后仅扫描该查询的结果。

如果此方法不够,您将需要根据您正在使用的访问模式重新考虑您的数据模型。

希望这会有所帮助:)如果您可以提供有关数据的更多上下文以及您想要如何检索它,我们很乐意与您一起构建格式。

© www.soinside.com 2019 - 2024. All rights reserved.