DynamoDB 如何对布尔值使用过滤表达式

Nik*_*las 5 ios amazon-dynamodb swift aws-sdk

如何使用布尔值表达式过滤 dynamoDB 表。我可以成功过滤 Int 或 String 值。但即使在 Web 控制台中尝试对 bool 值创建过滤表达式时,它也不会返回任何结果?

我也在 iOS 上的 Swift 上尝试了这一点,但事实上它甚至在 Web 界面中都不起作用,这让我想知道如何实现这一点。

如果我过滤 Int 它会起作用,即

    let queryExpression = AWSDynamoDBQueryExpression()
    queryExpression.rangeKeyConditionExpression = "age = :val"
    queryExpression.expressionAttributeValues = [":val": 30]
Run Code Online (Sandbox Code Playgroud)

但如果我尝试使用 Bool,它什么也不会返回。

    let queryExpression = AWSDynamoDBQueryExpression()
    queryExpression.rangeKeyConditionExpression = "enabled = :val"
    queryExpression.expressionAttributeValues = [":val": true]
Run Code Online (Sandbox Code Playgroud)

我还尝试过用 0 或 1 代替 true,或者使用“true”中的字符串。

然而,这种对 Bool 的过滤甚至在 AWS Web 界面中都不起作用。所以这看起来不是 Swift 的事情。也许这是不可能的,但看起来很奇怪。

事实证明我在这里很困惑,filterExpression 工作正常。

   let scanExpression = AWSDynamoDBScanExpression()
   scanExpression.filterExpression = "disabled = :val"
   scanExpression.expressionAttributeValues = [":val": false]
Run Code Online (Sandbox Code Playgroud)

Ser*_*nst 2

文档对此不是很清楚,但不可能在 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'},
    ]    
    ...
)
Run Code Online (Sandbox Code Playgroud)

如果“启用”范围键的类型为“S”、“N”或“B”,则调用将失败。

如果您想在范围键中有效地存储布尔值,您应该使用数字类型并分配 0 和 1 值,可以像您已经演示的那样进行过滤。

如果您有一个不是哈希键或范围键的布尔值,则可以使用 FilterExpression 而不是 RangeKeyConditionExpression 对其进行过滤,如FilterExpression 文档中所述。