【发布时间】:2021-11-09 18:28:15
【问题描述】:
我正在构建一个 GraphQL API。我希望允许用户使用多种排序来指定记录的排序方式。
什么应该是可能的
如果我公开了按name、birthdate 和id 对monsters 进行排序的功能,用户应该能够让API 按这些的任意组合进行排序,包括(在SQL 术语中):
ORDER BY name ASCORDER BY name ASC, birthdate DESC, id ASC- ...等
什么不起作用
一张地图,像这样:
sorts: [{name: DESC, id: ASC}]
...不会告诉我应用排序的顺序(地图是无序的)。
什么可行,但不理想
目前,我接受地图列表,如下所示:
sorts: [{name: DESC}, {id: ASC}]
每个映射代表一个输入对象,它具有name 和id 等字段,它们是具有可能值ASC 和DESC 的枚举。 我希望每个输入对象只填写一个字段。 〜但我不知道如何强制执行。〜
这很尴尬,因为:
- 用户很容易将排序参数输入为单个映射
- 如果不将默认值添加到每个输入对象映射中,我无法指定默认值(例如
ASCforid)
有没有更惯用的方式来接受排序参数的有序列表?
更新
现在,当每个地图有多个键时,我添加了一个面向用户的解释性错误。有了这个变化,我认为这个策略是可以的,但如果将来出现更好的方法,我仍然很高兴。
【问题讨论】:
-
我看到其他人(stackoverflow.com/a/58971399/4376)建议了
orderBy: {fields: [COMMENT, CREATED_AT], order: [ASC, DESC]},但是IMO这更尴尬,因为fields和order相互依赖,很容易搞砸,提供错误的order参数数量或顺序。 -
请记住,GraphQL API 最擅长解决的问题可能不是 SQL 服务器最擅长解决的问题。人们普遍认为“GraphQL 应该只是一个公共 SQL API”,但这条路通向地狱。 :)
-
@conny 点了。但我并不是要让用户能够做任何事情。对于排序,我指定在每种记录类型上哪些列是可排序的。但我不认为用户能够按多个排序是不合理的。当然还有其他示例,其中元组的有序列表将成为有用的 API 输入。
-
如果输入对象上的联合类型是可能的,我们可以说“排序是
monster_sortss 的列表,每个都是name_sort或age_sort或@ 987654343@"
标签: graphql