如何过滤 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" 的大小,您将需要执行更多后续查询直到你得到你的数据。
我有一个查询 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" 的大小,您将需要执行更多后续查询直到你得到你的数据。