我正试图从GSI获取记录,但被困住了。
API架构:
type DriverInfos {
id: String!
status: Int
lastLat: Float
lastLng: Float
idDriver: String # GSI
}
type Query {
getDriverInfosByDriver(idDriver: String): DriverInfos
}
解析器:
{
"version" : "2017-02-28",
"operation" : "Query",
"index" : "idDriver-index",
"query" : {
## Provide a query expression. **
"expression": "#idDriver = :idDriver",
"expressionNames" : {
"#idDriver" : "idDriver"
},
"expressionValues" : {
":idDriver" : {
"S" : "${ctx.args.idDriver}"
}
}
}
}
查询:
query getDriverInfosByDriver{
getDriverInfosByDriver(idDriver: "1")
{
idDriver
status
lastLat
lastLng
}
}
返回:
{
"data": {
"getDriverInfosByDriver": {
"idDriver": null,
"status": null,
"lastLat": null,
"lastLng": null
}
}
}
GSI已很好激活:名称:“ idDriver-index”-PartitionKey:idDriver(字符串) 尝试使用其他ID:2、3,...
它似乎来自解析器。我尝试使用其他解析器,但始终会返回错误。
预先感谢您的回答。
答案 0 :(得分:5)
问题是Query操作总是返回一组结果,而不仅仅是一个结果。如果要保留这样的查询类型:
type Query {
getDriverInfosByDriver(idDriver: String): DriverInfos
}
然后,您应该将响应映射模板更改为此:
#if($ctx.result.items.size() > 0)
$util.toJson($ctx.result.items[0])
#else
null
#end
如果相反, getDriverInfosByDriver 查询应返回多个信息对象,则应将架构更改为:
type DriverInfo {
id: String!
status: Int
lastLat: Float
lastLng: Float
idDriver: String # GSI
}
type DriverInfoConnection {
items: [DriverInfo]
nextToken:String
}
type Query {
getDriverInfosByDriver(idDriver: String): DriverInfoConnection
}
然后您可以将响应映射模板保留为默认值:
$util.toJson($ctx.result)
然后像这样查询它
query getDriverInfosByDriver{
getDriverInfosByDriver(idDriver: "1") {
items {
idDriver
status
lastLat
lastLng
}
}
}