GraphQL:过滤数组中的数据

标签 graphql graphcool

我确信这是一件简单的事情,但我在 GraphQL 的文档或 Graphcool 的文档中都找不到任何内容。

假设我有一个具有此模式的实体(新的 GraphQL 用户,如果我在模式表示中犯错,抱歉):

Book {
  name: String!
  author: String!
  categories: [String!]
}

我将如何查询属于 "mystery" 的所有书籍类别?我知道我可以用 allBooks(filter: {}) 过滤,但是 categories_in: ["mystery"]categories_contains: "mystery"没有做的伎俩。

最佳答案

Category模型

对这种情况多思考一点,创建一个 Category模型绝对是要走的路。

例如,假设您希望让读者稍后订阅他们最喜欢的类别。或者,如果您想要所有现有类别的列表怎么办?使用字符串列表,您需要查询所有书籍并以某种方式对所有获得的类别进行后处理。在模型级别处理这个而不是使用字符串列表感觉更自然。

相反,您可以创建一个新的 Category模型并在 Category 之间添加多对多关系和 Book .在这种情况下,我喜欢添加一个唯一的枚举字段 tag和一个字符串字段 text . (一个独特的字符串字段 tag 单独也是合适的,可能是品味问题。)

通过此设置,您可以轻松满足数据要求,例如

哪些书被分配到给定的类别?

query {
  # query books by unique category tag
  Category(tag: MYSTERY) {
    books {
      id
    }
  }
  # query books by specific category text
  Category(filter: {
    text: "mystery"
  }) {
    books {
      id
    }
  }
}

哪些书籍至少被分配到给定列表的一个类别?
query {
  allCategories(filter: {
    OR: [{
      tag: MYSTERY
    }, {
      tag: MAGIC
    }]
  }) {
    books {
      id
    }
  }
}

哪些书籍被分配到给定列表的所有类别?
query {
  allCategories(filter: {
    AND: [{
      tag: MYSTERY
    }, {
      tag: MAGIC
    }]
  }) {
    books {
      id
    }
  }
}

相关过滤器

即使上述查询满足指定的数据要求,书籍仍按 Category 分组。在响应中,这意味着我们将不得不扁平化客户端上的组。

使用所谓的相关过滤器,我们可以将其转换为仅根据定义其相关类别的条件来获取书籍。

例如查询 分配给给定列表的至少一个类别的书籍 :
query {
  allBooks(filter: {
    OR: [{
      categories_some: {
        tag: MYSTERY
      },
      categories_some: {
        tag: MAGIC
      }
    }]
  }) {
    id
  }
}

关于GraphQL:过滤数组中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41515226/

相关文章:

database - 为新用户注册填充数据库数据的方法

facebook-graph-api - 如何: Increment the value of an integer based field in GraphQL

javascript - 如何为 Apollo 客户端指定 GraphQL 查询并获取属性中出现适当字符串的项目

mongodb - 可以在没有 dynamoDB 的情况下使用 AWS App-Sync

python - 如何使用 Python AWS AppSync 客户端?

express - type-graphql 找不到模块 'class-validator' 异常

react-native - Apollo 客户端延迟授权 header

graphql - 如何在一个突变中创建嵌套节点?

filtering - Graphcool(Graphql): how to make exact filter in array of Id

graphql - GraphQL 和 SPARQL 有什么区别?