当前位置: 首页 > 知识库问答 >
问题:

如何在API的查询字符串中设计泛型过滤运算符?

钱震博
2023-03-14
    null
/events?properties.name=Harry&properties.address.city.neq=Washington

但是,如果事件的属性可以由用户定义,则会遇到一个问题,即使用普通相等运算符Address.city.neq属性和使用不相等运算符的Address.city属性之间可能发生冲突。

示例:Stripe的API

/events?properties.name=Harry&properties.address.city+neq=Washington

此示例与第一个示例类似,不同的是它使用+分隔符(相当于空格)进行操作,而不是.,这样就不会有混淆,因为我的域中的键不能包含空格。

/events?properties.name=Harry&properties.address.city=neq:Washington
/events?filter=properties.name==Harry;properties.address.city!=Washington

此示例使用单个顶级查询参数filter来命名下的所有筛选逻辑。这很好,因为您不必担心顶级名称空间冲突。(尽管在我的例子中,所有自定义都嵌套在属性下。所以这首先不是一个问题。)

但是这样做的代价是,当您想要进行基本的等式筛选时,要键入一个更难的查询字符串,这可能会导致大多数时间都必须检查文档。并且依赖于运算符的符号可能会导致诸如“near”、“invent”或“contains”等不明显的操作的混淆。

示例:Google Analytics的API

/events?filter=properties.name eq Harry; properties.address.city neq Washington
/events?filter[1][key]=properties.name&filter[1][eq]=Harry&filter[2][key]=properties.address.city&filter[2][neq]=Washington

共有1个答案

董飞
2023-03-14

我可能不会回答“哪一个最好”的问题,但我至少可以给你一些见解和其他的例子来考虑。

首先,您讨论的是“具有内容和可由用户定义的模式的通用API”。

这听起来很像solr/elasticsearch,它们都是Apache Lucene上的高级包装器,主要是索引和聚合文档。

GET /_search
{
  "query": { 
    "bool": { 
      "must": [
        { "match": { "title":   "Search"        }}, 
        { "match": { "content": "Elasticsearch" }}  
      ],
      "filter": [ 
        { "term":  { "status": "published" }}, 
        { "range": { "publish_date": { "gte": "2015-01-01" }}} 
      ]
    }
  }
}
q=*:*&fq={!cache=false cost=5}inStock:true&fq={!frange l=1 u=4 cache=false cost=50}sqrt(popularity)

关于我的经历。我们在这两层之上实现了另一层,我们采用了第四种方法。实际上,我认为#4和#5应该同时得到支持。为什么?因为无论你选择什么,人们都会抱怨,而且既然你将拥有自己的“微DSL”,那么你不妨为你的关键字支持更多的别名。

为什么不是2号?内部只有一个筛选器参数和查询,您就可以完全控制DSL。在我们制作我们的资源半年后,我们得到了“简单”的特性请求--逻辑和括号()。查询参数基本上是操作的列表,逻辑的(如City=London或Age>25)并不适合这里。另一方面,括号将嵌套引入DSL结构中,这也是平面查询字符串结构中的一个问题。

好吧,这些是我们偶然发现的问题,你的案子可能不一样。但是仍然值得考虑的是,对这个API的未来期望是什么。

 类似资料:
  • 如果嵌套更好,以Microsoft为例,如果我想为客户1创建一个新订单,我应该发送到或,正文中包含还是同时支持这两个命令?

  • 问题内容: 所有人都希望使用过滤的查询,其中结果应包含来自“ query_string”和来自“ term-filter”的数据。 预期结果是: 所有带有topic_id的字母“ a”或“”的博客记录均为10。 即使其描述为空白/空,也会记录topic_id为10的其余记录。 因此,最终结果应该是-具有较高分数的匹配记录,并且应该位于顶部,然后才是与过滤器中的“ topic_id”匹配的记录。 问

  • 问题内容: 在rails中,我使用gem进行搜索。我需要添加一个称为过滤器的字符串字段。如何添加到此插件? 我已经对此问题提出了一个问题Rails-如何在searchkick中添加更多字段以进行过滤 现在,我正在尝试使用字符串字段而不是布尔值,但搜索仍然无法正常工作。请同样帮助我。 我已经添加了一个条件,例如,根据此条件,我应该只获得活动用户(而不是“已删除”用户)。目前没有任何搜索数据在显示。

  • 问题内容: 我想对两个均扩展Number的相同类型的泛型参数执行操作。 可能吗?我一直习惯在泛型参数上调用方法,但使用运算符似乎存在一些问题(对于参数T,T,运算符+未定义)。 我究竟做错了什么? 编辑:我试图改善我的问题。我知道没有为Number类型定义运算符。这件事有点可悲,因为在不引入@Victor Sorokin建议的新接口的情况下执行这样的操作会很好。 但是我仍然不明白一件事:如果没有在

  • 问题内容: 我需要编写某种循环,可以计算字符串中每个字母的频率。 例如:“ aasjjikkk”将计为2’a’,1’s’,2’j’,1’i’,3’k’。最终,像这样的id最终以字符为键,而count为值的形式出现在地图中。有什么好主意怎么做? 问题答案: 你可以使用Java Map并将a映射到。然后,你可以遍历字符串中的字符,并检查是否已将它们添加到地图中(如果有),然后可以增加其值。 例如: 最

  • 问题内容: 如何计算特定字符串在另一个字符串中出现的次数。例如,这就是我要使用Javascript进行的操作: 问题答案: 在正则表达式(简称 全球 )说,搜索整个字符串,而不是只要找到第一次出现。这匹配两次: 并且,如果没有匹配项,则返回: