对于我最近的项目,我试图从dynamodb获取数据.似乎一切正常,除了我在参数中添加"exclusiveStartKey"选项.
以下是我的代码.
function scanDataFromDB(datetime) {
let params = {
TableName: TABLE_NAME,
IndexName: "main-index",
Select: "ALL_ATTRIBUTES",
ExclusiveStartKey: {
"message_id": { "S": "20161011175258875925351560"}
},
ExpressionAttributeNames: {
"#f_up": "date_updated"
},
ExpressionAttributeValues: {
":s_time": "2016-10-11 00:00:00",
":e_time": "2016-10-11 23:59:59"
},
FilterExpression: "#f_up between :s_time and :e_time",
ScanIndexForward: "true"
};
console.log(params);
docClient.scan(params, function(err, data) {
if(err) {
console.log(JSON.stringify(err, null, 2));
//callback(err, null);
} else {
console.log(JSON.stringify(data, null, 2));
//callback(null, err);
}
})
Run Code Online (Sandbox Code Playgroud)
}
这将继续"提供的起始键无效." 欢迎任何建议或帮助.
我已经包括了一些链接以及我们对其他答案的使用方法,这些链接似乎是目前网络上最理想的。
我们的记录需要分类(例如,“恐怖”,“惊悚”,“电视”),并且可以在特定类别和所有/某些类别中随机访问。我们通常一次需要访问大约20-100个项目。我们的类别数量也很少(少于100个)。
我们将数据写入数据库以上传/删除内容,尽管这是分批完成的,不需要实时。
我们尝试了两种不同的方法,以及两种不同的数据结构。
简而言之,将类别用作哈希键,并将UUID用作排序键。生成一个随机UUID,使用大于或小于1的值来查询Dynamo,并限制为1。AWS员工甚至在第二个链接中建议这样做。(我们还尝试过增加对所需项目数的限制,但这增加了查询第一次失败的可能性)。
这种方法的问题:
我们还考虑过为每个类别添加后缀,以人为地增加我们拥有的分区数量,如以下链接所示。
亚马逊网络服务:我们如何从dynamoDb的表中获取随机物品?
与此类似,我们将类别与序列号连接起来,并将其用作哈希键。例如horror-000001。
通过了解每个类别中的记录数,我们可以对整个数据集执行随机查询,同时还避免了热分区/键。
这种方法的问题
两种方法都可以解决我们对类别进行随机查询的主要用例,但是它们提供的缺点实际上阻止了我们使用它们。我们更倾向于使用后缀来解决热分区问题的方法#1,尽管对于失败的查询,我们需要额外的重试逻辑。
有没有更好的方法来解决此问题?专门寻找能够很好地扩展(无需扫描)且无需实施额外资源的解决方案。#1符合要求,但是需要管理后缀和失败的尝试确实阻止了我们使用它,尤其是当它在lambda中被调用(根据使用时间计费)时。
谢谢!