Amazon dynamodb 如何在aws dynamodb中实现“从InternalProductionDb order by DateTimeStamp desc limit 10中选择*

Amazon dynamodb 如何在aws dynamodb中实现“从InternalProductionDb order by DateTimeStamp desc limit 10中选择*,amazon-dynamodb,Amazon Dynamodb,我在dynamodb中有一个表,表结构如下: PKStatusId是String,排序键DateTimeStamp是Number。 我想通过DateTimeStamp desc limit 10从InternalProductionDb order中实现select* let params = { ExpressionAttributeValues: { ':min': { N: '200000000000' },

我在dynamodb中有一个表,表结构如下: PK
StatusId
String
,排序键
DateTimeStamp
Number
。 我想通过DateTimeStamp desc limit 10从InternalProductionDb order中实现
select*

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
参数。因此我编写了两条不可避免的判断语句。 我觉得这太复杂了,我犯了个错误。 错误是
查询键条件不受支持
那么,有人知道正确的解决方案吗?
非常感谢

DynamoDB不是关系数据库!您需要的是一个针对您的模式的非常复杂的查询

您需要一个针对时间序列查询进行优化的模式,例如“获取表中最近的10项”。这样的模式必须在水平缩放(Dynamo提供的现成功能)和数据的局部性之间提供折衷,以便组装您的响应

一种选择是按日期对数据进行分区。例如,使用日期作为分区键,使用时间戳作为排序键。然后,假设您获得了足够的数据,为了回答您的查询,您只需要查看今天和可能的前一天

当然,如果你每天都得不到足够的数据,事情会变得更加棘手,在这种情况下,确定最近的日期更为复杂。您可以将分区键的粒度更改为按周/月

您还可以使用其他类型的模式,将“最近”的数据全部保存在一个分区中,并将旧数据循环出来

但这里有另一个想法:您可以创建两个表——一个存储所有项目,另一个只保存最新项目。您可以在“最近的表”上使用TTL并删除超过某个阈值的记录,在此表上,您可以设置模式,使所有项都位于同一分区(即,它们的PK值相同),然后使用时间戳作为排序键。那么,获得最近的前十名就成了一个简单的问题

或者,您可以将关系数据库与DynamoDB结合使用以进行分析查询


进一步阅读:

DynamoDB不是关系数据库!您需要的是一个针对您的模式的非常复杂的查询

您需要一个针对时间序列查询进行优化的模式,例如“获取表中最近的10项”。这样的模式必须在水平缩放(Dynamo提供的现成功能)和数据的局部性之间提供折衷,以便组装您的响应

一种选择是按日期对数据进行分区。例如,使用日期作为分区键,使用时间戳作为排序键。然后,假设您获得了足够的数据,为了回答您的查询,您只需要查看今天和可能的前一天

当然,如果你每天都得不到足够的数据,事情会变得更加棘手,在这种情况下,确定最近的日期更为复杂。您可以将分区键的粒度更改为按周/月

您还可以使用其他类型的模式,将“最近”的数据全部保存在一个分区中,并将旧数据循环出来

但这里有另一个想法:您可以创建两个表——一个存储所有项目,另一个只保存最新项目。您可以在“最近的表”上使用TTL并删除超过某个阈值的记录,在此表上,您可以设置模式,使所有项都位于同一分区(即,它们的PK值相同),然后使用时间戳作为排序键。那么,获得最近的前十名就成了一个简单的问题

或者,您可以将关系数据库与DynamoDB结合使用以进行分析查询


进一步阅读:

链接到DynamoDB文档关于Thank@Charles-我已经添加了参考链接到DynamoDB文档关于Thank@Charles-我已经添加了参考链接