使用排序键作为filterExpression时,为什么AWSDynamoDBScanExpression返回空?

时间:2019-01-09 00:16:03

标签: ios swift amazon-web-services amazon-dynamodb aws-sdk

我有以下DynamoDB表:

BoardId   |  DateTime          |  Data  |  Type
-------------------------------------------------
1         |  20180424T123508Z  |  68.1  |  U
1         |  20181026T143233Z  |  38.2  |  T
1         |  20190108T120150Z  |  38.1  |  T
2         |  20180425T092311Z  |  63.4  |  U

“ BoardId”是分区键,“ DateTime”是排序键

我想获取包含“ 2019”的“ BoardId” =“ 1”和“ DateTime”的条目。
我使用AWSDynamoDBObjectMapper#scan通过以下代码执行此操作:

    let dbObjMapper = AWSDynamoDBObjectMapper.default()

    let scanExpression = AWSDynamoDBScanExpression()
    scanExpression.limit = 10
    scanExpression.filterExpression = "#id = :id AND contains(#dt, :dt)"
    scanExpression.expressionAttributeNames = [
        "#id" : "BoardId",
        "#dt" : "DateTime"
    ]
    scanExpression.expressionAttributeValues = [
        ":id" : "1",
        ":dt" : "2019"
    ]

    dbObjMapper
        .scan(Event.self, expression: scanExpression)
        .continueWith(block: {
            (task: AWSTask<AWSDynamoDBPaginatedOutput>!) -> Any? in
            if let error = task.error as NSError? {
                print("The request failed. Error: \(error)")
            } else if let paginatedOutput = task.result {
                print("The request was successful.")
                print(paginatedOutput.items.count)
                for event in paginatedOutput.items as! [Event] {
                    print(event)
                }
            }
            return ()
    })

但是我得到的结果是空的。没有错误(“ 请求成功。”),但打印paginatedOutput.items.count为0。从DynamoDB Web控制台执行相同的扫描时,我希望得到相同的结果:

dynamodb console

我使用AWSDynamoDBScanExpression有什么问题?

我尝试使用其他扫描配置:

  • 不设置filterExpression => 确定,最多返回10个项目
  • #id = :id => 确定,最多返回10个BoardId = 1的项目
  • contains(#dt, :dt) =>没有错误,但还返回空结果
  • scanExpression.indexName设置为某些索引,其中“ DateTime” 不是排序键(例如“ BoardId”是分区键和“类型”是排序键)=> 确定,返回与Web控制台相同的正确项

是否不允许将sort键用作过滤器表达式?

AWS SDK for iOS docsAWS Working with Scan docs中都没有提及(在此甚至说明“ 使用扫描,您可以在过滤器表达式中指定任何属性,包括分区键和排序键属性“)

1 个答案:

答案 0 :(得分:1)

我会尝试从您的扫描参数中删除scanExpression.limit = 10

来自https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Scan.html#DDB-Scan-request-Limit:“要评估的最大项目数(不一定是匹配的项目数)。”

所以可能发生的情况是,扫描正在查看10个项目,然后应用过滤器,该过滤器与它们都不匹配,并且您没有得到结果