0

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

现在我只有 3 列,orderID(主键)address、、confirmations(GSI)。

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

4

2 回答 2

0

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

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

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

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

或者,您可以在主表中捕获时间段并创建一个基于时间段进行分区并将购买作为排序键的 GSI。通过这种方式,您可以根据给定时间段有效地查询(而不是扫描)购买次数 >= 6 的所有商品。

于 2019-01-19T07:04:15.010 回答
-1

您不需要重新组织数据,只需使用扫描而不是查询

scan({
    TableName,
    IndexName,
    FilterExpression: 'purchases >= :p',
    ExpressionAttributeValues: { ':p': 6 }
});
于 2018-03-16T13:48:20.017 回答