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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用sort键作为filterExpression时,为什么AWSDynamoDBScanExpression返回空?相关的知识,希望对你有一定的参考价值。

我有以下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”是排序键。

我想要获取“BoardId”=“1”和“DateTime”包含“2019”的条目。 我使用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”是分区键,“Type”是排序键)=> OK,返回与Web控制台相同的正确项目

是否不允许使用排序键作为过滤器表达式?

AWS SDK for iOS docsAWS Working with Scan docs中没有提到这一点(这里甚至声明“使用Scan,您可以在过滤器表达式中指定任何属性 - 包括分区键和排序键属性”)

答案

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

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

所以可能发生的事情是扫描正在查看10个项目,然后应用过滤器,过滤器没有匹配,你没有得到任何结果

以上是关于使用sort键作为filterExpression时,为什么AWSDynamoDBScanExpression返回空?的主要内容,如果未能解决你的问题,请参考以下文章

DynamoDB:scan()与FilterExpression结合使用多个属性

TypeError:必须使用关键字参数作为键函数

SqlDataSource.FilterExpression Property

使用冻结集作为字典键是不是安全?

Python:元组/字典作为键、选择、排序

PHP数组函数