如何使用Lambda NodeJS比较DynamoDB中的字符串?



我有一个lambda函数,它在DynamoDB上发出一些请求。

var ddb = new AWS.DynamoDB({apiVersion: '2012-08-10'});
const lookupminutes = 10;
var LookupDate = new Date(Date.now() - 1000 * lookupminutes);
params = {
TableName: TableName,
IndexName: "requestdate-index",
KeyConditionExpression: "requestdate > :startdate",
ExpressionAttributeValues: {":startdate": {S: LookupDate.toISOString()}
},
ProjectionExpression: "id, requestdate"
};
var results = await ddb.query(params).promise();

当运行lambda函数时,我在对DynamoDB运行查询的行中得到这个错误:

不支持查询关键字条件

字段requestdate作为字符串存储在表中。

我做错了什么?

在分区键上只能使用等于操作符:

params = {
TableName: TableName,
IndexName: "requestdate-index",
KeyConditionExpression: "requestdate = :startdate",
ExpressionAttributeValues: {":startdate": {S: LookupDate.toISOString()}},
ProjectionExpression: "id, requestdate"
};

如果你需要在过去10分钟内返回所有数据,那么他们你有两个选择,这两个选择都不是很可扩展,除非你共享你的密钥(1a):

  1. 将索引中的所有数据放在同一个分区键下,排序键为时间戳。然后像这样使用KeyConditionExpression:gsipk=1 AND timestamp> 10mins

由于所有项都在相同的分区键下,因此查询将是高效的,但以可伸缩性为代价,因为您实际上会将吞吐量瓶颈限制在1000WCU。

1。如果您需要扩展到1000 WCU以上,最好的选择可能是执行上述操作,只是使用一个随机数作为分区键(在一个范围内)。例如range = 0-9。这将给我们10个唯一的分区键,允许我们扩展到10k WCU,但是需要我们并行请求10个Query来检索数据。

  1. 在基本表上使用FilterExpression扫描。如果你不想在GSI上把所有的东西都放在同一个键下,那么你可以扫描并添加一个过滤器。随着表的增长,这会变得缓慢和昂贵。

最新更新