【问题标题】:How to use OR / AND in graphql query filter or make a case insensitive filter?如何在 graphql 查询过滤器中使用 OR / AND 或制作不区分大小写的过滤器?
【发布时间】:2019-01-02 16:43:31
【问题描述】:

就像帖子问我需要能够搜索 3 种可能的场景。我需要全部大写,或小写,或正常大小写。

如果这是不可能的,有没有办法做一个不区分大小写的过滤器?

  allMarkdownRemark(filter: { brand: { eq: $normalBrand } }) { //==> Need more here
        edges {
            node {
                webImages {
                    url
                }
            }
        }
    }

我发现有人这样做:

filter: { OR: [
  {brand: { eq: $normalBrand }}, 
  {brand: { eq: $normalBrand2 }}, 
  {brand: { eq: $normalBrand3 }}
]}

但这对我不起作用

【问题讨论】:

标签: graphql gatsby


【解决方案1】:

目前,graphql 本身没有内置任何使用大小写不敏感搜索的东西,它完全基于 graphql 服务器正在运行的任何库以及是否选择添加对此的支持。如果您可以修改 graphql 查询代码,您可以以某种方式将其添加到自己中,或者请求托管/构建该代码的任何人以某种方式添加该功能。

关于 OR,我怀疑我能比 https://github.com/graphql/graphql-js/issues/585#issuecomment-262402544 说得更好

GraphQL 不支持 AND/OR 运算符,这正是您在问题顶部提到的原因:它不映射到任何类型的存储。我认为要正确理解为什么它没有这些需要改变思维模式。我们认为 GraphQL 更类似于 RPC 语言而不是数据库语言。

为了帮助理解心智模型的转变,考虑字段和参数(如编程语言中的函数调用)很有用。所以假设我们问一个类似的 javascript 问题:为什么你不能输入:getCaseByStatus("open" OR "closed")?我认为答案是因为 JavaScript 不知道 OR 在这种情况下意味着什么。值"open""closed" 是否应该以某种方式组合以产生另一个值?函数getCaseByStatus 的执行是否应该以某种方式改变? JavaScript 不能确定——因为基于字段的过滤概念不是 JavaScript 语义的一部分。 ...

【讨论】:

  • 如果你不能问它,它就不是一种查询语言。
【解决方案2】:

正则表达式有效吗?类似的东西

  allMarkdownRemark(filter: { brand: { 
     regex: "/($normalBrand)|($normalBrand2)|($normalBrand3)/" 
  } }) { 
        edges {
            node {
                webImages {
                    url
                }
            }
        }
    }

【讨论】:

    【解决方案3】:

    尝试使用小写“或”进行过滤

    过滤器:{ 或:[{brand: { eq: $normalBrand }}, {brand: { eq: $normalBrand2 }},{brand: { eq: $normalBrand3 }}]}

    【讨论】:

      猜你喜欢
      • 2013-10-24
      • 1970-01-01
      • 2013-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-02
      • 2017-11-08
      • 2018-03-04
      相关资源
      最近更新 更多