在Appsync graphql中过滤一对多精确数据

问题描述

我对此建模:

type FreightDriver
  @model
  @key(
    name: "byCityByState"
    fields: ["state","city"]
    queryField: "freightDriversByStateByCity"
  ) {
  id: ID!
  name: String!
  state: String!
  city: String!
  trucks: [Truck] @connection(keyName: "byFreightDriver",fields: ["id"])
}

type Truck
  @model
  @key(name: "byFreightDriver",fields: ["freightDriverId","tons"]) {
  id: ID!
  freightDriverId: ID!
  BoxId: ID!
  brand: String!
  model: String!
  tons: Float!
  Box: Box @connection(fields: ["BoxId"])
}

type Box @model {
  id: ID!
  type: String!
  width: Float!
  height: Float!
  depth: Float!
}

我正在这查询数据:

query {
  freightDriversByStateByCity(state: "Jalisco",city: { eq: "Guadalajara" }) {
    items {
      id
      name
      city
      state
      trucks(tons: { eq: 12 }) {
        items {
          brand
          model
          Box {
            type
          }
        }
      }
    }
  }
}

我得到的回应是:

{
  "data": {
    "freightDriversByStateByCity": {
      "items": [
        {
          "id": "aebb6696-573d-41ed-894e-22b69264cace","name": "Diey","city": "Guadalajara","state": "Jalisco","trucks": {
            "items": [
              {
                "brand": "chevrolet","model": "12","Box": {
                  "type": "Refrigerada"
                }
              }
            ]
          }
        },{
          "id": "6e8e6772-61e7-47d6-b134-d615a3c65f62","name": "Roberto Mendez","trucks": {
            "items": []
          }
        },{
          "id": "d314808c-64e7-421d-b83b-008177ab6b25",{
          "id": "19847d0c-185c-48f6-9e5c-435e3907133a","name": "Andrés","model": "1234","Box": {
                  "type": "Refrigerada"
                }
              },{
                "brand": "chevrolet","Box": {
                  "type": "Grúa"
                }
              },{
          "id": "2c4c9e3a-bfe5-4d4e-bee7-3eddb1b8ef1b","name": "Roberto Mendez ",{
          "id": "cb4eb22c-aa54-416e-aecc-305a18bc9c83","trucks": {
            "items": []
          }
        }
      ]
    }
  }
}

如果您检查,有一些与此有关:

"trucks": {
  "items": []
}

如何避免它们?我的模型是错误的模型吗?谢谢!

解决方法

您可以使用映射模板修改响应数据,然后将其返回给客户端:

响应映射模板是使用Apache Velocity模板语言(VTL)编写的,并将解析器的结果转换回GraphQL。

在这种情况下,您可以检查trucks.items是否为空,如果是,则在返回之前将items中的trucks数组删除。

此处有更多详细信息:https://docs.aws.amazon.com/appsync/latest/devguide/resolver-mapping-template-reference-programming-guide.html