【问题标题】:Sort GraphQL query results in the exact order of input array按照输入数组的确切顺序对 GraphQL 查询结果进行排序
【发布时间】:2022-01-25 19:50:32
【问题描述】:

我需要从支持 GraphQL 的数据库中获取一些项目(无法控制其架构)并按照调用的确切顺序输出它们。

例如,如果数据库以相应的顺序保存项目 1,2,3,我需要将它们作为 3,1,2

查询:

{items(filter: {id: {_in: ["3","1","2"] } } ) {data}}

实际结果:

{"data": {"items": [{"data": "data-from-1"},{"data": "data-from-2"},{"data": "data-from-3"}]}}

预期结果:

{"data": {"items": [{"data": "data-from-3"},{"data": "data-from-1"},{"data": "data-from-1"}]}}

所以我想我正在寻找的是一个与其他运算符相关的“元”运算符,而不是实际查询 - 类似于:

sort:["_in"]orderby:{operator:"_in"}

...但我没有设法找出这样的事情是否存在。

那么一般情况下还是可能在某些 GraphQL 风格中是可能的?还是我唯一的选择是使用别名预先构建查询并这样做:

{ 
_3: items(filter:{id: { _eq: "3" }}){data}
_1: items(filter:{id: { _eq: "1" }}){data}
_2: items(filter:{id: { _eq: "2" }}){data}
}

【问题讨论】:

    标签: sorting graphql operators sql-order-by


    【解决方案1】:

    您使用的是哪个 GraphQL 客户端? 如果您使用的是 Apollo,并且您确实无法访问服务器中的架构/解析器,您可以创建一个本地字段并自行解析它,这样您就可以随心所欲地进行操作。

    参考 https://www.apollographql.com/docs/react/local-state/managing-state-with-field-policies/#defining

    基本上,如果您要查询如下字段:

    query {
      someQuery(someFilter: {foo: "bar"}) {
        items {
          data
        }
      }
    }
    

    您可以创建一个本地字段并将typePolicy 写入其中。然后您可以查询如下内容:

    query {
      someQuery(someFilter: {foo: "bar"}) {
        items {
          data
        }
    
        parsedItems @client
      }
    }
    

    然后你可以从ìtems获取数据,并在本地解析parsedItems

    【讨论】:

    • 这对性能有好处吗?因为否则,预构建方法似乎更容易实现,只是完成了另一个功能和工作。
    • (仅使用 fetch)。无论如何,我不能确定我是否会有匹配的数据来检查,所以这种方法应该尽可能“盲目”。
    • 如果您只处理查询中描述的内容,那将不是问题,但取决于您要获取的项目数量,以及这些项目的结构可能是一个问题。但是,您说您无法控制服务器,因此,没有其他方法可以指定数据的返回方式,除非它们有一个参数供您传递。换句话说,由于字段的解析方式和顺序是您无法控制的,因此没有其他方法可以进行这种排序。
    • 那么,我需要检查一下我没有以尴尬的方式做一些琐碎的事情/也不确定是否有一种标准化的方式告诉服务器如何返回数据。
    猜你喜欢
    • 2018-12-15
    • 2022-01-10
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 2013-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多