在dynamodb中对GSI执行条件表达式查询

时间:2018-03-16 03:21:42

标签: amazon-dynamodb secondary-indexes dynamodb-queries

我知道DynamoDB不支持下面的查询,因为您必须在HASH密钥上使用等式表达式。 query({ TableName, IndexName, KeyConditionExpression: 'purchases >= :p', ExpressionAttributeValues: { ':p': 6 } });  如何组织我的数据,以便我可以有效地查询所购买的所有商品> = 6次?

现在我只有3列,orderID(主键),addressconfirmations(GSI)。

为这种类型的查询使用不同类型的数据库会更好吗?

2 个答案:

答案 0 :(得分:0)

您无需重新组织数据,只需使用scan代替查询

scan({
    TableName,
    IndexName,
    FilterExpression: 'purchases >= :p',
    ExpressionAttributeValues: { ':p': 6 }
});

答案 1 :(得分:0)

您可能想要使用DynamoDB流功能来聚合到另一个DynamoDB表中。流功能将针对数据的每次更改发布事件,然后您可以使用Lambda函数对其进行处理。

我假设在您的主表中您将跟踪每次购买,并增加一个计数器。一个简单的逻辑示例可能是每次更新,您检查商品的购买计数,如果> = 6,则将商品ID添加到另一个DynamoDB表中的列表属性itemIDs或类似属性中。根据查询此统计信息的方式,您可能每天,每小时等创建一个新条目。

请记住,DynamoDB每个属性有400KB的限制,因此,根据给定时间段内需要在itemIDs属性中捕获多少个项目,这可能不是最佳解决方案。

您还需要考虑如何重置购买计数器(这可能是计划的批处理作业,您每隔x个时间段将购买计数重置为零)。

或者,您可以在主表中捕获时间段,并创建一个GSI,该GSI根据时间段进行分区,并以购买作为排序键。这样,您可以根据给定的时间段有效地查询(而不是扫描)购买数量大于等于6的所有商品。