Elemente zu finden, wo DynamoDB-Attribut ist nicht gesetzt, *oder* mehr als x

Ich bin versucht zu Scannen einer DynamoDB-Tabelle von Lambda – (Node.js), um zu prüfen, ob ein token ist abgelaufen. Ich möchte die Daten filtern, die zum ausschließen von Elementen, bei denen expiration_time festgelegt ist, und ist weniger als die aktuelle Zeit. Ich habe derzeit eine false-positive-für Einheiten, wo keine expiration_time eingestellt ist.

Wie kann ich prüfen, ob ein abgelaufener Zeitstempel oder keine expiration_time Attribut überhaupt?

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",
        }
    }
}
InformationsquelleAutor Tyler | 2016-01-09



One Reply
  1. 3

    Es stellt sich heraus, der beste Weg, um eine „ODER“ – operation ist die Verwendung der neuen, string-basierte Filterung-Befehle. AttributesToGet wird ersetzt durch ProjectionExpression, und ScanFilter wird ersetzt durch FilterExpression.

    Beachten Sie, dass mit der neuen Befehle, die Sie nicht in der Lage sein zu verwenden reservierte Wörter und arbeiten müssen, um alle reservierten Wörter von der Definition dieser Schlüssel mit ExpressionAttributeNames und alle Werte, die mit ExpressionAttributeValues.

    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()}
        }
    }

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.