如何过滤 dynamodb 中 time_stamp 超过 1 天的条目?

How can I filter entries in dynamodb which has time_stamp more than 1 day?

我有一个查询 dynamoDb table userDetailTable 的 lambda 函数,我只想过滤时间戳(以毫秒为单位记录)在减去时超过 1 天(86400000 毫秒)的条目来自(新 Date.getTime())。任何人都可以建议我以正确的方式做这件事吗?

Dynamo Table 的 GSIndex 为 user_status,所有条目的值为 'active',epoch_timestamp(以毫秒为单位的时间戳)作为用于过滤器表达式的属性。 在 Lambda 中,我正在检查 epoch_timestamp 并尝试在查询中用 (new Date.getTime()) 减去 epoch_timestamp,我不确定这是否可能。下面是包含我的查询的代码。

function getUserDetails(callback){
  var params = {
    TableName: 'userDetailTable',
    IndexName: 'user_status-index',
    KeyConditionExpression: 'user_status = :user_status',
    FilterExpression: `expiration_time - ${new Date().getTime()} > :time_difference`, 
    ExpressionAttributeValues: { 
      ':user_status': 'active',
      ':time_difference': '86400000' // 1 day in ms  
    } 
  };
  docClient.query(params, function(err, data) {
    if(err) {
      callback(err, null)
    } else{
      callback(null, data)
    }
  })
}

您无法在过滤器表达式中执行计算,但您可以在外部进行计算并将结果与​​新的不等式一起使用。

我想您正在寻找一天后过期的商品。 像

FilterExpression: 'expiration_time > :max_time',
ExpressionAttributeValues: { 
  ':user_status': 'active',
  ':max_time': new Date().getTime() + 86400000 // 1 day in ms // i.e. one day from now.
}

这是您的代码的重写:

function getUserDetails(callback){
    var params = {
        TableName: 'userDetailTable',
        IndexName: 'user_status-index',
        KeyConditionExpression: 'user_status = :user_status',
        FilterExpression: 'epoch_timestamp > :time_threshold_ms', 
        ExpressionAttributeValues: { 
            ':user_status': 'active',
            ':time_threshold_ms': Date.now() - 86400000
        } 
    };
    docClient.query(params, function(err, data) {
        if(err) {
            callback(err, null)
        } else{
            callback(null, data)
        }
    })
}

具体来说,在 FilteExpression 中您无法计算任何日期。相反,您应该将项目的 epoch_timestamp 属性与您在 ExpressionAttributeValues

计算一次(对于查询检查的所有项目)的 time_threshold_ms 进行比较

请注意,如果您定义一个使用 epoch_timestamp 作为其 排序键 的 GSI(user_status 可以保留分区键)。然后,不是将条件放在 FilterExpression 中,而是需要将其移动到 KeyConditionExpression 中。

此外,当您使用 FilterExpression 时,您需要检查响应的 LastEvaluatedKey。如果它不为空,您需要发出后续查询,并将 LastEvaluatedKey 复制到请求的 ExclusiveStartKey 中。为什么?由于过滤,您可能得不到 DDB 检查的 "chunk"(或 "page")的结果。 DDB 在每次查询调用时只检查一个 "chunck"。使用 ExclusiveStartKey 发出后续查询将告诉 DDB 检查下一个 "chunk".

(有关详细信息,请参阅 https://dzone.com/articles/query-dynamodb-items-withnodejs

或者,如果您不使用过滤,建议您在请求中传递一个 Limit 值,以告诉 DDB 在所需数量的项目后停止。但是,如果您确实使用过滤 ,请不要传递 Limit,因为它会减小 "chunk" 的大小,您将需要执行更多后续查询直到你得到你的数据。