DynamoDB как использовать выражение фильтра для значения типа bool

Как мне отфильтровать таблицу DynamoDB с выражением для значения типа bool. Я могу успешно фильтровать по значению типа Int или String. Но даже в веб-консоли при попытке создать выражение фильтра для значения типа bool оно не даст никаких результатов?

Я тоже пробую это из Swift на iOS, но тот факт, что он даже не работает в веб-интерфейсе, заставляет меня задаться вопросом, как вообще этого добиться.

Если я фильтрую по Int, он работает, т.е.

    let queryExpression = AWSDynamoDBQueryExpression()
    queryExpression.rangeKeyConditionExpression = "age = :val"
    queryExpression.expressionAttributeValues = [":val": 30]

Но если я попробую Bool, он ничего не вернет.

    let queryExpression = AWSDynamoDBQueryExpression()
    queryExpression.rangeKeyConditionExpression = "enabled = :val"
    queryExpression.expressionAttributeValues = [":val": true]

Я также пробовал 0 или 1 вместо истины или строку, как в «истине».

Однако эта фильтрация на Bool даже не работает в веб-интерфейсе AWS. Так что это не похоже на Swift. Может быть, это невозможно, но кажется странным.

Оказывается, я запутался, filterExpression работает нормально.

   let scanExpression = AWSDynamoDBScanExpression()
   scanExpression.filterExpression = "disabled = :val"
   scanExpression.expressionAttributeValues = [":val": false]

person Niklas    schedule 09.03.2016    source источник
comment
Любой код того, что вы пробовали?   -  person Eendje    schedule 09.03.2016
comment
@Eendje см. Правку выше.   -  person Niklas    schedule 09.03.2016


Ответы (1)


В документации это не очень ясно, но невозможно создать таблицу в DynamoDB с логическим хешем или ключом диапазона. Ключи хэша и диапазона могут быть только строкового (S), числового (N) или двоичного (B) типа. Если вы попытаетесь создать таблицу с логическим (BOOL) ключом диапазона, например:

create_table(
    AttributeDefinitions=[
        {'AttributeName': 'something', 'AttributeType': 'S'},
        {'AttributeName': 'enabled', 'AttributeType': 'BOOL'}
    ],
    TableName='example',
    KeySchema=[
        {'AttributeName': 'something', 'KeyType': 'HASH'},
        {'AttributeName': 'enabled', 'KeyType': 'RANGE'},
    ]    
    ...
)

вызов завершится ошибкой при условии, что ключ диапазона «включен» должен иметь тип «S», «N» или «B».

Если вы хотите эффективно сохранить логическое значение в ключе диапазона, вы должны использовать числовой тип и присвоить значения 0 и 1, которые можно фильтровать, как вы уже продемонстрировали.

Если у вас есть логическое значение, которое не является ключом хеша или диапазона, вы можете отфильтровать его с помощью FilterExpression вместо RangeKeyConditionExpression, как описано в документация FilterExpression.

person Sernst    schedule 09.03.2016
comment
Ага, я путал rangeExpression с filterExpression в Swift. Так что это на самом деле отлично работает let scanExpression = AWSDynamoDBScanExpression () scanExpression.filterExpression = disabled =: val scanExpression.expressionAttributeValues ​​= [: val: false] - person Niklas; 09.03.2016