如何解决使用最新时间戳和电子邮件ID
我想用emailId过滤用户并获取最近的行条目,即基于要显示的电子邮件ID获取用户的最新数据。在我的情况下,subscriptionID是分区键。没有二级索引或排序键。有这样做吗?还是我应该采用的其他方法?
我的Dynamo查询:-
var docClient = new AWS.DynamoDB.DocumentClient({ region: AWS.config.region });
var params = {
TableName: 'License',FilterExpression: "customerEmail = :email",ExpressionAttributeValues: {
':email': email
},};
docClient.scan(params,function(err,data) {
if (err)
{
console.log(err);
}
else
{
console.log('length ',data.Items.length);
console.log(data.Items);
}
});
解决方法
scan
是从DynamoDB获取数据的最昂贵的方法,在大多数情况下应避免使用。
您当前正在使用subscriptionID作为分区键,这不能帮助您通过客户电子邮件获取项目。最有效的方法是使用主密钥,将用户电子邮件作为分区密钥,并将时间戳(购买日期)作为排序密钥。如果以这种方式存储数据,则可以执行以下操作:
query(
TableName= 'License',KeyConditionExpression= '#pk = :pk',ExpressionAttributeNames={
'#pk': 'subscriptionID'
},ExpressionAttributeValues={
':pk': { 'S': 'apandey@projitechinc.com' }
},ScanIndexForward=False,Limit=1
)
关于此操作的一些注意事项:
- 这是一个
query
操作,比scan
操作更有效。 -
ScanIndexForward=False
将使用排序键以降序排序(设置为true或以升序省略)。 -
Limit=1
为您带来最佳结果(例如最新条目)
当然,您的数据当前不以支持该查询的方式存储。为此,您有两个选择:
- 更改存储数据的方式以支持此访问模式。如果这样做会破坏其他访问模式,则可能不是一个选择。
- 引入二级索引,该二级索引使用用户电子邮件作为分区密钥,并以购买日期作为排序密钥。
要充分利用DynamoDB,必须设计表以及如何存储数据以支持应用程序访问模式。如您所见,您当前的设计无法轻松支持所需的访问模式。有多种方法可以设计表以支持这种类型的查询,但是这种模式在许多应用程序中很常见。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。