查找DynamoDB属性未设置*或*大于x的项目

我试图从Lambda(Node.js)扫描一个DynamoDB表来检查一个令牌是否已经过期。 我想筛选数据,以排除设置了expiration_time项目并且小于当前时间。 我目前得到了没有设置expiration_time单位的误报。

我怎样才能检查过期的时间戳没有expiration_time属性设置?

 dynamodb.scan({ "TableName": "fm_tokens", "AttributesToGet": ["user_id"], "ScanFilter": { "token": { "AttributeValueList": [{"S": tkn.toString()}], "ComparisonOperator": "EQ" }, "token_time": { "AttributeValueList": [{"N": expiration.toString()}], "ComparisonOperator": "GE" }, "expiration_time": { "AttributeValueList": [{"N": unix_timestamp.toString()}], "ComparisonOperator": "GE", } } } 

事实certificate,执行“OR”操作的最好方法是使用新的基于string的过滤命令。 AttributesToGetProjectionExpression取代, FilterExpressionFilterExpression取代。

请注意,对于新命令,您将无法使用保留字,并且必须通过使用ExpressionAttributeNames定义这些键以及使用ExpressionAttributeNames定义任何值来解决任何保留字。

 dynamodb.scan({ // Define table to scan "TableName": "fm_tokens", // Only return selected values (optional) "ProjectionExpression": "user_id", // Write your expression, similar to SQL syntax "FilterExpression": "#token = :tkn AND "+ "token_time >= :expiration AND "+ "(attribute_not_exists(expiration_time) OR expiration_time >= :timestamp)", // Use this to avoid reserved words by defining variables with the name instead "ExpressionAttributeNames": { "#token": "token" }, // Same as with names, but for values - must include value type (S, N, etc.) "ExpressionAttributeValues": { ":tkn": {"S": tkn}, ":expiration": {"N": expiration.toString()}, ":timestamp": {"N": unix_timestamp.toString()} } }