2015-08-04 19 views
6

Dowiaduję się, jak filtrować wyniki ze skanowania lub zapytania przy pomocy DynamoDB firmy Amazon. Spodziewam się, że przykładowy filtr będzie wyglądał jak filter => name = Bob lub niektóre takie. Jednak firma Amazon wymaga użycia atrybutu wyrażenia, takiego jak filter => name = :person, a następnie ExpressionAttributeValues => { ":person": {"S": "Bob"}} To jest mylące i rani moją głowę, dlaczego nie mogę użyć prostego name = Bob?Dlaczego DynamoDB wymaga wartości expressionAttributeValue?


oficjalne docs: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html#FilteringResults

przykład Podobno pracuje blisko końca: https://github.com/aws/aws-cli/issues/1073

Odpowiedz

9

Ten rodzaj składni następujące podejścia, które jest podobne do przygotowanych sprawozdań, które są wykorzystywane w systemach SQL. To była decyzja projektowa, którą stworzył zespół DynamoDB w AWS. Jednym z powodów jest zezwolenie na pola, które są sprzeczne z długą listą reserved words (w tym "nazwa", której używałeś w swoim przykładzie), które są zdefiniowane przez DynamoDB.

Unikanie słów zarezerwowanych jest w rzeczywistości wykonywane przy użyciu atrybutu ExpressionAttributeNames i określania nazw atrybutów. Odwoływałeś się do ExpressionAttributeValues, gdzie określono listę wartości. Więcej informacji można znaleźć na stronie dokumentacji Using Placeholders for Attribute Names and Values.

Inną motywacją tego projektu jest oddzielenie instrukcji od nazw parametrów i wartości, podobnie do przygotowanych instrukcji w SQL, o czym już wspominałem. Chociaż na pierwszy rzut oka może się wydawać to dziwne, to ma dodatkową zaletę, że skutecznie odkaża twoje dane wejściowe w sensie NoSQL, unikając możliwych złośliwych lub niezamierzonych problemów z wprowadzaniem danych przez użytkownika, które wpływają na zachowanie twojego żądania dotyczącego interakcji z DynamoDB.