如何获取父节点的ID作为参数?

时间:2017-05-18 13:51:20

标签: graphql

要求是:

  1. 获取在X半径内的特定日期播放的电影列表
  2. 每部电影都会播放正在播放该电影的场地(按距离排列)
  3. 对于每个场地,获取在该日期播放电影的活动
  4. 目前的架构是:

    type Query {
      movies (
        first: Int
        after: String
        coordinates: CoordinatesInput!
        date: String
      ): MovieConnection!  
    }
    
    type Movie implements Node {
      id: ID!
      name: String!
      venues (
        first: Int
        after: String
        movieId: ID!
        coordinates: CoordinatesInput!
        date: String!
      ): VenueConnection!
    }
    
    type Venue {
      id: ID!
      name: String!
      events (
        date: String!
        venueId: ID!
        movieId: ID!
      ): EventConnection!
    }
    
    type Event implements Node {
      id: ID!
      venue: Venue!
      movie: Movie!
    }
    

    其中*Connectioncursor pagination实施细节。

    实际上,我需要能够编写一个等同于:

    的查询
    query (
      $date: String!
      $coordinates: CoordinatesInput!
    ) {
      movies(
        date: $date
        coordinates: $coordinates
      ) {
        edges {
          node {
            id
            name
            venues(
              date: $date
              coordinates: $coordinates
              # WARNING! made up syntax
              movieId: $parent.parent.movieId
            ) {
              edges {
                node {
                  id
                  name
                  events (
                    date: $date
                    # WARNING! made up syntax
                    movieId: $parent.parent.parent.parent.movieId
                    venueId: $parent.parent.venueId
                  ) {
                    edges {
                      node {
                        id
                        date
                        time
                        timestamp
                        url
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
    

    据我所知,的规范没有描述在参数中引用父节点的方法。

    什么有用...... 反转问题。

    问题的反面很简单。我只需要按日期和位置定义事件,然后检索与该事件相关的场地和电影,例如

    getEventsByDateAndLocation(date: "2017-05-18", location: [..]) {
      id
      venue {}
      movie {}
    }
    

    这种方法的问题在于它会大大增加服务器响应,例如:如果我们每页显示200个事件且Movie / Venue大小为1kb,则响应突然变为400kb(未经过gziped)。如果记录被标准化,响应将是~20kb。这是一个很大的不同。

    一种可能的解决方案是提出两个请求:一个用于检索事件列表(连同所需的标识符),另一个用于检索实际资源,例如

    getEventsByDateAndLocation(date: "2017-05-18", location: [..]) {
      id
      venue {
        id
      }
      movie {
        id
      }
    }
    

    (后跟批量查询以按其ID检索VenueMovie

    这具有数据组合复杂性的缺点。

0 个答案:

没有答案