我有以下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控制台执行相同的扫描时,我希望得到相同的结果:>
我使用AWSDynamoDBScanExpression
有什么问题?
我尝试使用其他扫描配置:
filterExpression
=> 确定,最多返回10个项目#id = :id
=> 确定,最多返回10个BoardId = 1的项目contains(#dt, :dt)
=>没有错误,但还返回空结果scanExpression.indexName
设置为某些索引,其中“ DateTime” 不是排序键(例如“ BoardId”是分区键和“类型”是排序键)=> 确定,返回与Web控制台相同的正确项是否不允许将sort键用作过滤器表达式?
在AWS SDK for iOS docs或AWS Working with Scan docs中都没有提及(在此甚至说明“ 使用扫描,您可以在过滤器表达式中指定任何属性,包括分区键和排序键属性“)
答案 0 :(得分:1)
我会尝试从您的扫描参数中删除scanExpression.limit = 10
。
来自https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Scan.html#DDB-Scan-request-Limit:“要评估的最大项目数(不一定是匹配的项目数)。”
所以可能发生的情况是,扫描正在查看10个项目,然后应用过滤器,该过滤器与它们都不匹配,并且您没有得到结果