【问题标题】:Combining a looping listing query with specific parameters query将循环列表查询与特定参数查询相结合
【发布时间】:2021-10-22 07:23:09
【问题描述】:

我有两个单独的工作调用,定义如下,我试图弄清楚如何组合它们。该架构特定于Meetup API,,但我认为一般的 GraphQL-fu 可以在这里提供帮助!

  • 调用 1 获取 N 事件 ID 列表
query($query:String!,$lat: Float!,$lon:Float!,$radius:Int!) {
    keywordSearch(filter: {query: $query,lat: $lat, lon: $lon, radius:$radius source:EVENTS, eventType:PHYSICAL}) {
      count 
      edges{
        node{
          id
        }
      } 
    }
}

作为示例查询: {"query":"knitting ","lat":37.774929,"lon":-122.419418,"radius":50}

以下是结果(编织聚会在旧金山并不常见):

{
  "data": {
    "keywordSearch": {
      "count": 3,
      "edges": [
        {
          "node": {
            "id": "281538648!chp"
          }
        },
        {
          "node": {
            "id": "281467251!chp"
          }
        },
        {
          "node": {
            "id": "281455979!chp"
          }
        }
      ]
    }
  }
}
  • 调用 2 从调用 1 中返回的 id 获取额外的事件信息
  query($eventId: ID) {
    event(id: $eventId) {
      ... bare_event
    }
  }
  
  fragment bare_event on Event{
    title 
      dateTime
      eventUrl
      onlineVenue{
        type
        url
      }
      venue{
                ... bare_venue
      }
  }
  
  fragment bare_venue on Venue{
        id
        name
        address
  }
  

因此,例如,从 Call1 中获取第一个 ID,使用 {"eventId":"281538648!chp"},我们得到

{
  "data": {
    "event": {
      "title": "Monday Knitting Meetup (Mountain View)",
      "dateTime": "2021-10-25T19:00-07:00",
      "eventUrl": "https://www.meetup.com/scv-knitters/events/281538648",
      "onlineVenue": null,
      "venue": {
        "id": "25006220",
        "name": "Panera Bread (YET ANOTHER PANERA!!)",
        "address": "1035 El Monte Ave"
      }
    }
  }
}

我们如何在调用 1 中包含调用 2 的详细事件信息以及每个事件 ID?

我认为 GraphQL 的意义在于,我不必进行 N+1 查询来获取与搜索列表相关的 N 项目的附加信息(我是新手!)

您如何将这两个调用组合到一个查询中,以便除了仅提取事件 ID 之外,我还可以为每个搜索列表提取其他事件信息?

【问题讨论】:

    标签: graphql meetup


    【解决方案1】:

    这是查询以及如何获取数据

    query ($query: String!, $lat: Float!, $lon: Float!, $radius: Int!) {
      keywordSearch(
        filter: {query: $query, lat: $lat, lon: $lon, radius: $radius, source: EVENTS, eventType: PHYSICAL}
      ) {
        count
        edges {
          node {
            id
            result {
              ... on Event {
                title
                dateTime
                eventUrl
                onlineVenue {
                  type
                  url
                }
                venue {
                  id
                  name
                  address
                }
              }
            }
          }
        }
      }
    }
    
    {
      "query": "knitting ",
      "lat": 37.774929,
      "lon": -122.419418,
      "radius": 50
    }
    

    【讨论】:

    • 啊,所以我缺少的概念是union - 基本上SearchNode 包含事件... on Event { 类型的结果?
    • 没错。联合类型意味着该类型可以是定义中的任何类型。为了从类型中指定您想要的字段,您使用内联片段。这是一种说法:如果您找到类型事件,请使用这些字段。您可以对联合中的所有类型或您感兴趣的类型重复此操作
    • 一旦您对答案感到满意。接受它,让它关闭
    • 谢谢!知道 GraphQL 中的 union 与 SQL 完全不同,非常有用!
    猜你喜欢
    • 2023-03-10
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-17
    • 2019-02-05
    相关资源
    最近更新 更多