首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在aws-dynamodb中实现` `select * from InternalProductionDb order by DateTimeStamp desc limit 10`

如何在aws-dynamodb中实现` `select * from InternalProductionDb order by DateTimeStamp desc limit 10`
EN

Stack Overflow用户
提问于 2019-01-12 19:21:14
回答 1查看 29关注 0票数 0

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

主键StatusIdString,排序关键字DateTimeStampNumber。我想实现select * from InternalProductionDb order by DateTimeStamp desc limit 10;

代码语言:javascript
运行
复制
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,所以有谁知道正确的解决方案吗?非常感谢

EN

回答 1

Stack Overflow用户

发布于 2019-01-13 04:34:18

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

您需要一个针对时间序列查询进行优化的模式,例如"get 10 most recent items in the table“。这样的模式必须在水平缩放( Dynamo提供的是开箱即用的)和数据的局部性之间提供折衷,以便组合您的响应。

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

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

您还可以采用某种其他类型的模式,将“最新”数据全部保存在一个分区中,并轮换出旧数据。

但这里有另一个想法:您可以创建两个表-一个存储每个项目,另一个仅保存最近的项目。您可以在“最近的表”上使用TTL,并删除超过某个阈值的记录,并且在此表上,您可以设置模式,使所有项目落入同一分区(即。它们具有相同的PK值),然后使用时间戳作为排序关键字。然后,获取最新的前10名就变成了一个简单的查询。

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

进一步阅读:Best Practices for Time Series Databases on DynamoDB

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54159095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档