我知道DynamoDB不支持下面的查询,因为您必须在HASH密钥上使用等式表达式。
query({
TableName,
IndexName,
KeyConditionExpression: 'purchases >= :p',
ExpressionAttributeValues: { ':p': 6 }
});
如何组织我的数据,以便我可以有效地查询所购买的所有商品> = 6次?
现在我只有3列,orderID
(主键),address
,confirmations
(GSI)。
为这种类型的查询使用不同类型的数据库会更好吗?
答案 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的所有商品。