我在两个特定的unixtime值之间查询数据。例如:
1516338730 (今天,6:12)和 1516358930 (今天,11:48)之间的所有数据
我的数据库每分钟收到一条新记录。现在,当我想查询最后24h的数据时,它的方式太密集了。每隔10分钟就会很完美。
我现在的问题是:如何使用DynamoDB读取仅每10个数据库记录?
据我所知,没有可能使用模数或类似的东西来满足我的需要。
到目前为止,这是我的AWS Lambda代码:
var read = {
TableName: "user",
ProjectionExpression:"#time, #val",
KeyConditionExpression: "Id = :id and TIME between :time_1 and :time_2",
ExpressionAttributeNames:{
"#time": "TIME",
"#val": "user_data"
},
ExpressionAttributeValues: {
":id": event, // primary key
":time_1": 1516338730,
":time_2": 1516358930
},
ScanIndexForward: true
};
docClient.query(read, function(err, data) {
if(err) {
callback(err, null);
}
else {
callback(null, data.Items);
}
});
};
答案 0 :(得分:1)
我不认为使用dynamoDB API是可行的。
FilterExpression包含在Query操作之后但在数据返回给您之前应用DynamoDB的条件。 但是AFAIK不可能使用自定义功能。并内置functions are poor.
作为解决方法,您可以在客户端标记每个第10个项目。然后查询attribute_exists(或属性值)进行查询以过滤它们。
顺便说一下,用排序键'TIME'为'Id'属性创建索引会很好,以提高查询性能。答案 1 :(得分:1)
你说你每分钟插入1条记录吗?
以下可能是一个选项:
在插入时,在记录上设置另一个字段,让我们将其称为MinuteBucket
,其计算方式为the timestamp's minute value mod 10
。
如果您通过流功能执行此操作,则可以处理新记录,然后编写内容以触摸旧记录以强制进行计算。
您的查询将更改为:
/*...snip...*/
KeyConditionExpression: "Id = :id and TIME between :time_1 and :time_2 and MinuteBucket = :bucket_id",
/*...snip...*/
ExpressionAttributeValues: {
":id": event, // primary key
":time_1": 1516338730,
":time_2": 1516358930,
":bucket_id": 0 //can be 0-9, if you want the first record to be closer to time_1, then set this to :time_1 minute value mod 10
},
/*...snip...*/
正如后续想法一样:如果您想加快查询速度,可能会在索引中使用MinuteBucket
进行调查,但这可能会带来更高的价格。