使用最新时间戳和电子邮件 ID 在 DynamoDB Table 中过滤值
Filter value in DynamoDB Table using Latest TimeStamp & EmailID
我想用 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,您必须设计 table(s) 以及如何存储数据以支持您的应用程序访问模式。如您所见,您当前的设计无法轻易支持您想要的访问模式。有许多方法可以设计您的 table 以支持此类查询,但这种模式在许多应用程序中很常见。
我想用 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,您必须设计 table(s) 以及如何存储数据以支持您的应用程序访问模式。如您所见,您当前的设计无法轻易支持您想要的访问模式。有许多方法可以设计您的 table 以支持此类查询,但这种模式在许多应用程序中很常见。