我在dynamodb中有一个表,表结构如下:

主键StatusId为String,排序关键字DateTimeStamp为Number。我想实现select * from InternalProductionDb order by DateTimeStamp desc limit 10;
let params = {
ExpressionAttributeValues: {
':min': {
N: '200000000000'
},
':max': {
N: '300000000000'
},
':beg':{
S:'2'
}
},
TableName: "InternalProductionDb",
ConsistentRead: true,
Limit: 10,
KeyConditionExpression:' DateTimeStamp between :min and :max and begins_with(StatusId,:beg)' ,
ScanIndexForward:true
};
let res = await ddb.query(params).promise();
console.dir(res);
return res;实际上,因为我不需要做任何有条件的判断,所以我并不真正需要KeyConditionExpression,但API必须指定我写了两个不可避免的判断语句的KeyConditionExpression parameter.So。我认为这太复杂了,我得到了一个错误。错误是Query key condition not supported,所以有谁知道正确的解决方案吗?非常感谢
发布于 2019-01-13 04:34:18
DynamoDB不是关系数据库!您所要求的是针对您的模式的一个非常复杂的查询。
您需要一个针对时间序列查询进行优化的模式,例如"get 10 most recent items in the table“。这样的模式必须在水平缩放( Dynamo提供的是开箱即用的)和数据的局部性之间提供折衷,以便组合您的响应。
一种选择是按日期对数据进行分区。例如,使用日期作为分区键,使用时间戳作为排序键。然后,假设您获得了足够的数据,为了回答您的查询,您只需查看今天,可能是前一天。
当然,如果你不总是每天都获得足够的数据,事情就会变得更加棘手,在这种情况下,找出最近的日期会更加复杂。您可以将分区键的粒度更改为按周/月。
您还可以采用某种其他类型的模式,将“最新”数据全部保存在一个分区中,并轮换出旧数据。
但这里有另一个想法:您可以创建两个表-一个存储每个项目,另一个仅保存最近的项目。您可以在“最近的表”上使用TTL,并删除超过某个阈值的记录,并且在此表上,您可以设置模式,使所有项目落入同一分区(即。它们具有相同的PK值),然后使用时间戳作为排序关键字。然后,获取最新的前10名就变成了一个简单的查询。
或者,您可以将关系数据库与DynamoDB结合使用,以进行分析查询。
https://stackoverflow.com/questions/54159095
复制相似问题