2017-12-07 3 views
0

Ich baue eine triviale API mit API Gateway bis DynamoDB. Ich versuche, eine bedingte Abfrage für einen Sortierschlüssel durchzuführen, und ich bekomme immer die Nachricht "Abfrageschlüssel bedingt nicht unterstützt." Aber alles, was ich in den Dokumenten gelesen habe, sagte, das sollte tatsächlich funktionieren.Bedingte Abfrage des Sortierschlüssels in DynamoDB funktioniert nicht?

Ich versuche, so etwas wie zu tun:

{ 
    "TableName": "testTable", 
    "KeyConditionExpression": "requestTimeEpoch > :since", 
    "ExpressionAttributeValues": { 
     ":since": { 
      #if($input.params('since') != "") 
       "S": "$input.params('since')" 
      #else 
       "S": "1" 
      #end 
     } 
    } 
} 

Ich habe irgendwo gelesen, dass jemand dieses Problem hatte, als eine Nummer verwenden, so habe ich versucht, es in einen String statt umzuschalten. Wie auch immer, sollte das nicht funktionieren?

(requestTimeEpoch ist die Art/Bereich Schlüssel für die Raute-Taste)

Antwort

1

Sie können die Sortierschlüssel auf eigene verwenden. Daten werden nur innerhalb ihrer Partition sortiert. Sie müssen also einen Partitionsschlüssel (dies muss ein Gleichheitsoperator sein) für Ihre Abfrage angeben.

Wenn Sie Ihren Partitionsschlüssel nicht verwenden möchten, müssen Sie zu einem Scanvorgang wechseln. Ein Scan benötigt keine Schlüsselbedingungen.

EDIT: Also mit einer Partition (Hash) Schlüssel könnte es so etwas wie

{ 
    "TableName": "testTable", 
    "KeyConditionExpression": "YourHash = :hash and requestTimeEpoch > :since", 
    "ExpressionAttributeValues": { 
     ":since": { 
      #if($input.params('since') != "") 
       "S": "$input.params('since')" 
      #else 
       "S": "1" 
      #end 
     ":hash" : {S: 'yourHashId'} 
     } 
    } 
} 

und ein Scan

var params = { 
    TableName: "testTable", 
    FilterExpression: "#since > :time", 
    ExpressionAttributeNames: { 
     "#since": "time", 
    }, 
    ExpressionAttributeValues: { 
     ":time": 2017, 
    } 
}; 
+0

Ok sein, die dann viel mehr Sinn macht. Ich habe nicht verstanden, wie es intern gespeichert wurde, obwohl ich die Dokumente gelesen habe. Leider kann ich das nicht direkt vom API Gateway aus nutzen, so wie ich es mir erhofft hatte. Ich muss eine Lambda-Funktion verwenden, damit ich einen Hash-Schlüssel des Tages oder Monats verwenden kann, den ich nicht direkt mit dem Mapping erreichen kann ... so nah und doch so weit! –