GraphQL:筛选数组中的数据

GraphQL:筛选数组中的数据,graphql,graphcool,Graphql,Graphcool,我确信这是一件简单的事情,但我在GraphQL的doc或GraphTool中都找不到任何东西 假设我有一个具有此模式的实体(新GraphQL用户,如果我在模式表示中出错,请原谅): 如何查询属于“神秘”类别的所有书籍?我知道我可以用allbook(filter:{})进行过滤,但是categories\u在:[“神秘”]和categories\u中包含:“神秘”没有起到作用。如果你对使用托管的GraphQL服务感兴趣,那么这个功能已经有一段时间了。API中的所有连接字段都带有一个wherergs

我确信这是一件简单的事情,但我在GraphQL的doc或GraphTool中都找不到任何东西

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


如何查询属于
“神秘”类别的所有书籍?我知道我可以用
allbook(filter:{})
进行过滤,但是
categories\u在:[“神秘”]
categories\u中包含:“神秘”
没有起到作用。

如果你对使用托管的GraphQL服务感兴趣,那么这个功能已经有一段时间了。API中的所有连接字段都带有一个
wherergs
参数,该参数公开了一些过滤器,让您能够真正深入挖掘数据。当您有这样一个标量列表时,whereRG包括一个
contains
&
notContains
字段,允许您根据列表中的值筛选结果。这允许您进行如下查询

query MysteriousBooks($where:BookWhereArgs) {
  viewer {
    allBooks(where:$where) {
      edges { node { title, ... } }
    }
  }
}

# Variables
{
  "where": {
    "categories": {
      "contains": "mystery"
    }
  }
}
为了完整起见,您还可以稍微重新调整模式,使其能够工作,而不必对标量列表进行过滤。例如,您可以将
Category
作为实现类型的节点,然后在
Category
Book
之间创建连接。尽管
书籍
可能没有很多类别,但这将允许您发出如下查询:

query MysteriousBooks($where: CategoryWhereArgs) {
  viewer {
    allCategories(where: $where) {
      books {
        edges { node { title, ... } }
      }
    }
  }
}

# Variables
{
  "where": { 
    "name": { 
      "eq": "mystery" 
    } 
  }
}
如果您以这种方式构建模式,那么您还可以对类别中的书籍进行更多过滤,而不必循环浏览归档中的每一本书。例如,你可以有效地索要“去年写的所有神秘书”

充分披露:我在Scaphold工作,虽然我希望你能尝试一下,但如果你不换工作的话,我不会感到难过。我很高兴看到人们尝试并热爱GraphQL。如果您对如何在自己的服务器上实现这种行为感到好奇,请告诉我,我也很乐意为您提供帮助

我希望这有帮助

类别
型号 再考虑一下这种情况,创建一个
类别
模型无疑是一条可行之路

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

相反,您可以创建一个新的
类别
模型,并在
类别
书籍
之间添加多对多关系。在这种情况下,我喜欢添加唯一的枚举字段
标记
和字符串字段
文本
。(单独使用一个独特的字符串字段
标记
也很合适,这可能是一个品味问题。)

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

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

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
    }
  }
}
哪些书籍被分配到给定列表的至少一个类别?

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
    }
  }
}
哪些书籍被分配到给定列表的所有类别?

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
    }
  }
}
相关过滤器 尽管上述查询满足指定的数据要求,但在响应中,书籍是按
类别
分组的,这意味着我们必须在客户机上展平这些组

使用所谓的相关过滤器,我们可以改变这种情况,仅根据相关类别定义的条件获取书籍

例如,要查询指定给给定列表中至少一个类别的图书,请执行以下操作:

query {
  allBooks(filter: {
    OR: [{
      categories_some: {
        tag: MYSTERY
      },
      categories_some: {
        tag: MAGIC
      }
    }]
  }) {
    id
  }
}

GraphTool当前不支持此操作。我已经添加了一个功能请求来跟踪这一点:好吧,很高兴知道。我去把你的问题处理掉。希望我们能很快得到这个!当前的一个解决方法可能是引入一个新的模型
类别
,该模型与
书籍
具有多对多关系。然后您可以这样做:
allCategories(过滤器:{tag:“summit”}){books{id}}
。我想拥有一个
类别
模型可能对未来的元数据或类似的东西有利。不幸的是,它并没有真正回答这个问题。我试图查询shopify产品,每个产品都包含一个标签数组,这些标签是字符串。我猜不可能查询所有包含给定标签的产品?!解决方案:获取所有产品并在客户机上进行过滤!