有没有一种更优雅的方式来代替编写大量查询?

亚当·托玛

我正在使用GraphQL,Apollo Express和MongoDB和Mongoose建立一个小型博客。

目前,文章是按其ID提取的,访问者可以在此处浏览ID为“ 123”的文章:example.com/articles/123

相反,我想使用,因此访问者可以转到example.com/articles/same-article-as-above

到目前为止,我的解析器:

import { gql } from 'apollo-server-express';

export default gql`
  extend type Query {
    articles: [Article!]
    article(id: ID!): Article
  }

  type Article {
    id: ID!
    slug: String!
    title: String!
    desription: String!
    text: String!
  }
`;

我可以添加另一个查询:

    articleBySlug(slug: String!): Article

这将完全正常。但是,这在我看来并不十分优雅,我觉得我缺少一些基本的了解。每次尝试按标题,文本,描述或其他内容获取文章时,是否真的需要向解析器添加新查询?我最终会遇到很多查询,例如“ articleByTitle”,“ articleByDate”等等。有人可以给我一个提示,示例或一些最佳做法(或者只是确认我确实必须添加越来越多的查询☺)?

米卡·里尔班克(Mikael Lirbank)

这样做的常见方法是将所有输入添加到同一查询中,并使它们成为可选的:

export default gql`
  extend type Query {
    articles: [Article!]
    article(id: ID, slug: String, date: String, search: String): Article
  }

  type Article {
    id: ID!
    slug: String!
    title: String!
    description: String!
    text: String!
  }
`;

然后,在解析器中,只需检查是否提供或中的一个idslug否则date返回错误。

另一种选择是使用类似于Gmail使用的搜索字符串(例如id:x before:2012-12-12),然后在解析器中对其进行解析。

export default gql`
  extend type Query {
    articles: [Article!]
    article(search: String): Article
  }

  type Article {
    id: ID!
    slug: String!
    title: String!
    description: String!
    text: String!
  }
`;

第三种选择是设置一个单独的搜索查询,该查询可以返回几种类型:

export default gql`
  extend type Query {
    articles: [Article!]
    search(query: String!, type: SearchType): SearchResult 
  }

  union SearchResult = Article | User

  enum SearchType {
    ARTICLE
    USER
  }

  type Article {
    id: ID!
    slug: String!
    title: String!
    description: String!
    text: String!
  }

  type User {
    id: ID!
    email: String!
    name: String!
  }
`;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

有没有一种更优雅的方式在Ruby中编写不知道数组大小的while循环?

有没有一种方法可以更优雅地编写此“ if”列表?

有没有一种优雅的Python方式来计数已处理数据?

有没有一种优雅的方式来定义关系?

有没有更优雅的方式来编写这个 If/or 条件?

有没有一种“流畅”的方式来编写进度条?

有没有一种更Python化的方式来编写修改列表的循环?

有没有更优雅的方式?

现在是2014年,有没有一种优雅的方法来插入大量数据行呢?

有没有一种优雅的方法来避免 Promise 的代码重复?

有没有更优雅的方式来将else语句与独立的if()s一起使用

在Julia中,有没有一种优雅的方式可以做到“不在”?

在Scala中有没有一种优雅的方式可以处理Monad?

有没有更优雅的方式在Kotlin中编写此吸气剂?

有没有更优雅的方式来重复使用代码块?

有没有更优雅的方式来启动基于列表的线程?

有没有更优雅的方式来执行这个 switch 语句?

有没有更好/更干净/更优雅的方式来分配和释放cuda?

有没有更优雅的方式来编码此生成器?

有没有更优雅的方式来声明新的 var 并同时使用 global

有没有更优雅的方式来读取CSV列并与记录ID合并?

有没有一种聪明的方法来隐藏 HTML 中的大量文本?

有没有更优雅的方法来查询多个OR和AND上的多对多表?

有没有更优雅的方式来写这些条件?

是否有一种更优雅的解决方案来填充地图中的列表?

有没有一种惯用的方式来缓存Spark数据帧?

有没有一种Objective-C特定的方式来对整数进行计数

有没有一种宏的方式来前缀和引用C宏参数

有没有一种更pythonic的方式来跳过xlsx中的行?