当前位置: 首页 > 知识库问答 >
问题:

使用"包含"查询DynamoDB项

许振海
2023-03-14

假设我有一个DynamoDB表,比如

TableName: 'Items'
Key: {Hash: 'Id'}

每个项目都有一个名称,属于一个客户,所以我也有一个索引

{Hash: CustomerId, Range:Name}

假设我有以下数据:

Id    CustomerId    Name
1     18            Milk
2     42            Orange juice
3     42            Apple juice
4     42            Coffee
5     54            Tomato juice

现在,我想查询特定客户的所有项目,并过滤部分名称的结果(本质上是一个搜索操作)。例如,给我所有属于客户42且名称中包含“果汁”的项目(橙汁和苹果汁是预期结果)。

如果我查询CustomeId='42'AND包含(名称,'果汁'),我将得到一个错误,说关键条件表达式不支持包含。我可以理解这个限制,因为包含意味着必须扫描所有项目(在给定的散列键内),但是,你可以用CustomeId='42'查询所有项目,这也是一个完整的扫描哈希,所以我不确定我是否理解这个限制。像begins_with这样的东西得到了预期的支持(这是有意义的,因为从排序集快速返回子集很容易)。

不管怎么说,我诅咒了一点,说我将只使用FilterExpression来代替,并使用浪费的RCU:s,从而产生一个带有

KeyConditionExpression: CustomerId = '42'
FilterExpression: contains(Name, 'juice')

但是现在我得到一个错误,说我不允许在我的FilterExpression中包含主键属性(“改用KeyConditionExpression!”)。

这让我有些进退两难。我无法在我的KeyCondition中使用contains进行筛选,也无法在我的FilterExpression中使用Name进行筛选。为了实现我的用例,我应该只在CustomerId上创建一个单独的索引,还是有其他方法来解决这个问题。。。?


共有3个答案

酆恩
2023-03-14

对于这样的东西,你应该考虑复合键和GSI重载的概念,并重新设计你的表来适应你的访问模式

根据https://aws.amazon.com/blogs/database/choosing-the-right-dynamodb-partition-key/

使用复合属性。如果符合访问模式,请尝试组合多个属性以形成唯一键。例如,考虑一个订单表,该表将Custerid productid国家代码作为分区键,order_date作为排序键。

因此,您可以做一些事情,比如将表设计为包含customerid\name

汲丰茂
2023-03-14

DynamoDB仅允许在关键条件下以()开头。因此不支持contains(),但对于您的情况,可以按如下层次顺序排列rangeKey:

CustomerId    Name
18            Milk
42            juice.Orange 
42            juice.Apple
42            Coffee
54            Tomato juice

所以查询的结构可以像

KeyConditionExpression: CustomerId = '42' AND Name BEGINS_WITH 'juice'

注:

  • 使用contains()的唯一方法似乎是在筛选表达式中,筛选表达式只能对非键进行操作
子车鸿才
2023-03-14

对于DynamoDB,我认为最好的解决方案是将数据存储在您稍后打算读取的形状中。

如果您发现自己需要复杂的读取查询,您可能会陷入期望DynamoDB表现得像RDBMS的陷阱,但事实并非如此。在写入时转换和塑造数据,保持读取简单。

 类似资料:
  • 假设我有一个DynamoDB表: UserId是主键(hash),我需要将BookName设置为排序键(range),因为添加到数据库中的另一项用相同的UserId覆盖了前面的项。

  • 我有一个AWS DynamoDb表, 我有user_id作为索引或GSI(user_id-index), 还有product_type作为索引或GSI(prod_type-index). 我试图使用KeyConditionExpression来查询DynamoDb表, 但是我得到了一个- 引用- Dynamodb查询错误-不支持查询键条件 https://docs.aws.amazon.com/a

  • 我有一个带有哈希键(id)的表(配置文件),我有一个关于名称的GSI,一个关于国家的范围键。我想创建一个DAO方法,它将获取所有具有给定值的name和country的记录,如下所示:List getProfileWithNameAndCountry(name,country);

  • 我刚开始在DynamoDB上建一个社交网站。 我将有相当数量的数据与一个用户相关,我计划将这些全部放入一个表中--例如: 用户ID 出生日期 头发 照片URL 详细信息 可能有几百个属性。 问题: 将这么多数据放入一个表中有什么问题吗? 我如何查询该数据(我是否可以执行类似这样的查询:“所有在这个年龄,这个颜色头发,这个位置,并且这次登录的成员)-假设所有这些数据都包含在表中? 如果一个表的内容很

  • 我有一个react应用程序,我正在使用AWS amplify。我的问题是,当我从DynamoDB查询数据时,通过AWS AppSync的正确方式是正确的,然后我是否有一个lambda函数来查询数据库,还是AppSync只是这样做?这样做的正确途径是什么?它会反应吗-

  • 我对DynamoDB上的查询/扫描限制有疑问。 我的表有1000条记录,对所有记录的查询都返回50个值,但是如果我把设为5,这并不意味着查询将返回前5个值,它只是说对5个项目的查询表(以任何顺序,所以它们可能是非常旧的项目或新的项目),所以我有可能在查询中得到0个项目。如何实际获得查询的最新5项?我需要设置一个为5(数字是例子),因为查询/扫描更多的项目会很昂贵。 该查询具有此输入 我的表的索引是