Запрос AppSync по глобальному вторичному индексу - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь получить запись из 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 (String) Попробуйте с другими идентификаторами: 2, 3, ...

Кажется, это исходит от распознавателя. Я пробовал использовать другой распознаватель, но он всегда возвращает ошибку.

Заранее благодарю за ответы.

1 Ответ

0 голосов
/ 29 августа 2018

Проблема в том, что операция 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 
    }
  }
}
...