在GraphQL中查询,获取与类别关联的项目列表

时间:2019-07-27 17:26:35

标签: amazon-dynamodb graphql aws-amplify

我有一个带有项目的GraphQL模式,每个项目都有关联的接口。我能够通过项目编号的@key来查询它。但是现在,我无法获得与项目关联的项目。这里是一些信息:

我的GraphQL模式:

type Project 
  @model @key(fields: ["project_number"]) 
  {
    project_number: String!
    name: String!
    architect: String!
    interfaces: [Interface] @connection(name: "ProjectInterfaces")

  }
type Interface
  @model 
  {
    id: ID!             
    interface_name: String!
    version: String!
    release: String!    
    project: Project @connection(name: "ProjectInterfaces")          
  }

这是我进行的查询:

query GetProject {
  getProject(project_number:"P100") {
    project_number
    name
    architect
    interfaces{
      items{
        id
        interface_name
      }
    }
  }
}

在我使用上面没有密钥的模式作为project_number之前,我为项目使用了id:ID!之类的东西。这样,我就可以使用相同的查询,并获得具有该ID的关联项目。但是,既然我使用了project_number的密钥,它将不允许我返回关联的项目。也许这是一个架构问题?我当时以为这可能是解决程序问题,但我在解决程序中玩耍,似乎没有任何效果。有关解析器的背景。我相信这是由于interfaceTable解析器。这是它自动生成的代码。我不知道该怎么解决。

#set( $limit = $util.defaultIfNull($context.args.limit, 10) )
#set( $query = {
  "expression": "#connectionAttribute = :connectionAttribute",
  "expressionNames": {
      "#connectionAttribute": "interfaceProjectId"
  },
  "expressionValues": {
      ":connectionAttribute": {
          "S": "$context.source.id"
    }
  }
} )
{
  "version": "2017-02-28",
  "operation": "Query",
  "query":   $util.toJson($query),
  "scanIndexForward":   #if( $context.args.sortDirection )
    #if( $context.args.sortDirection == "ASC" )
true
    #else
false
    #end
  #else
true
  #end,
  "filter":   #if( $context.args.filter )
$util.transform.toDynamoDBFilterExpression($ctx.args.filter)
  #else
null
  #end,
  "limit": $limit,
  "nextToken":   #if( $context.args.nextToken )
"$context.args.nextToken"
  #else
null
  #end,
  "index": "gsi-ProjectInterfaces"
}

我目前还为接口表提供了一个gsi索引,称为“ gsi-ProjectInterfaces”

请让我知道大家都认为可能是问题所在!谢谢!

1 个答案:

答案 0 :(得分:0)

解决您问题的一种方法是再次删除@key指令。

然后使用listProjects进行查询并按project_name进行过滤。

query listProjects {
  listProjects(filter: {
    project_number:{
      eq: "some-number"
    }
  }) {
    project_number
    name
    architect
    interfaces{
      items{
        id
        interface_name
      }
    }
  }
}

从本质上讲,这只是一项查询。尽管效率低一些,但这取决于项目的大小可能不是问题。 (使它工作,使其正确,使其快速->快最后一个?)