使用最新时间戳和电子邮件 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
)

这个操作需要注意的几点:

  1. query操作,比scan操作效率高很多
  2. ScanIndexForward=False 将使用排序键按降序排序(设置为 true 或省略升序)。
  3. Limit=1 为您提供最佳结果(例如最新条目)

当然,您的数据当前未以支持此查询的方式存储。为此,您有两个选择:

  1. 更改存储数据的方式以支持此访问模式。如果这样做会破坏其他访问模式,则这可能不是一个选项。
  2. 引入一个二级索引,使用用户电子邮件作为分区键,购买日期作为排序键。

要充分利用 DynamoDB,您必须设计 table(s) 以及如何存储数据以支持您的应用程序访问模式。如您所见,您当前的设计无法轻易支持您想要的访问模式。有许多方法可以设计您的 table 以支持此类查询,但这种模式在许多应用程序中很常见。